Обработка большого xml параллельно с использованием xpath с верблюдом соответствует только одному выражению - PullRequest
0 голосов
/ 11 февраля 2020

Во-первых, большое спасибо за вашу помощь заранее!

Я хочу обрабатывать большой xml файл (10 МБ) параллельно, транслируя вхождения по одному. xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<PFA date="202002072200" type="daily">
    <CountryList>
       <CountryName code="AARCT" name="Antarctica" IsTerritory="True" />
       <CountryName code="ABKHAZ" name="Abkhazia" IsTerritory="True" />
       ...
    </CountryList>
    <OccupationList>
        <Occupation code="1" name="Occupation 1" />
        <Occupation code="2" name="Occupation 2" />
        ...
    </<OccupationList>
</PFA>

Есть больше группирующих тегов, но для простоты позвольте мне уменьшить его до двух.

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

Я пробовал использовать следующие фрагменты, но для обоих фрагментов в журналах отображается только первая группа.

        from("file:/route/to/my/dir")        
            .split(xpath("//PFA/CountryList/CountryName"))
                .streaming().log("Country ${headers.CamelSplitIndex} contains: ${body}")
            .split(xpath("//PFA/OccupationList/Occupation"))
                .streaming().log("OccupationList ${headers.CamelSplitIndex} contains: ${body}")

, а также:

        from("file:/home/dalonso/Documentos/documentos/normalizador")
            .choice()
                .when(xpath("//PFA/CountryList"))
                    .to("direct:countriesRoute")
                .when(xpath("//PFA/OccupationList"))
                    .to("direct:occupationsRoute");

        from("direct:countriesRoute").split(xpath("//PFA/CountryList/CountryName")).streaming()
                .log("Country ${headers.CamelSplitIndex} contains: ${body}").end();

        from("direct:occupationsRoute").split(xpath("//PFA/OccupationList/Occupation")).streaming()
                .log("OccupationList ${headers.CamelSplitIndex} contains: ${body}").end();

У кого-нибудь есть идеи о том, как ее решить. Я предполагаю, что это должно быть что-то очень тривиальное, но я не могу найти что-нибудь около inte rnet.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 11 февраля 2020

Я наконец достиг этого, используя следующий фрагмент:

        from("file:/home/dalonso/Documentos/documentos/normalizador")

                .split(xpath("//PFA"))
                .multicast()
                .to("direct:countriesRoute")
                .to("direct:occupationsRoute");

        from("direct:countriesRoute")           
        .split(xpath("//PFA/CountryList/CountryName")).streaming()
                .log("Country ${headers.CamelSplitIndex} contains: ${body}").end();

        from("direct:occupationsRoute").split(xpath("//PFA/OccupationList/Occupation")).streaming()
                .log("OccupationList ${headers.CamelSplitIndex} contains: ${body}").end();

Пожалуйста, не стесняйтесь вносить любые предложения, чтобы улучшить его. Большое спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...