Apache camel - разделить XML-файл по размеру элемента (максимальное количество элементов на файл) - PullRequest
0 голосов
/ 24 октября 2019

Я хочу разделить файл XML.

оригинальный файл:

<home>
   <address>a1</address>
   <address>a2</address>
   <address>a3</address>
   <address>a4</address>
   ....
   ....
   <address>an</address>
</home>

Например, я хочу разделить файл XML с двумя элементами адреса в каждом файле.

file1:

<home>
   <address>a1</address>
   <address>a2</address>
</home>

file2:

<home>
   <address>a1</address>
   <address>a2</address>
</home>

....

file m:

<home>
   <address>a(n-1)</address>
   <address>an</address>
</home>

Я пробовал какниже. Но я не могу получить ожидаемый результат.

from("file:///home/tharanga/task2/input?noop=true&delete=true")
 .split(xpath("home/address"))
 .streaming()
 .aggregate(AggregationStrategies.groupedExchange())
 .constant(true)
 .completionSize(2)
 .completionTimeout(1000)
 .to("file:///home/tharanga/task2/output2");

Большое спасибо за помощь в решении этой проблемы.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Наконец-то я нашел правильное решение для вышеуказанной задачи.

Мы можем использовать xtokanize и для получения более подробной информации см. Ссылку ниже.

https://camel.apache.org/manual/latest/split-eip.html#_streaming_big_xml_payloads_using_tokenizer_language

Найдите приведенный ниже пример кода для моей задачи:

from("file:///home/tharanga/task2/input?noop=true&delete=true")
    .split()
    .xtokenize("//home/address", 'w', new Namespaces(), 2)
    .setHeader(Exchange.FILE_NAME, simple("${file:name.noext}-${header.CamelSplitIndex}.${file:ext}"))
    .to("file:///home/tharanga/task2/output8?noop=true");
0 голосов
/ 25 октября 2019

groupedExcange стратегия агрегации объединит биржи в список, поэтому вам нужно будет выполнить для них дополнительную обработку. Чтобы упростить его, я бы предложил вам добавить .convertBodyTo(String.class), а также использовать GroupedBodyAggregationStrategy вместо GroupedExchangeAggregationStrategy, чтобы получить List<String> в результате агрегирования.

Если предположить, что ваш процессор будет выглядеть как

.process(new Processor()) {
    public void process(Exchange exchange) throws Exception {
         String body = exchange.getIn().getBody().join();
         StringBuilder sb = new StringBuilder();
         sb.append("<home>");
         sb.append(body);
         sb.append("</home>");
         exchange.getIn().setBody(sb.toString());
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...