Groovy: удалить много узлов XML из документа - PullRequest
0 голосов
/ 01 марта 2019

У меня есть скрипт Groovy, который берет XML из веб-службы и преобразует его в JSON.В дополнение к преобразованию XML в JSON мне также необходимо удалить большое количество узлов из XML.Мой входящий XML довольно сложен и связан с работой, поэтому я не могу поделиться им, но вот что-то похожее.Узел события повторяется.

<root>    
    <event>
        <description>
            <type>earthquake name</type>
            <text>10km ENE of Blackhawk, CA</text>
        </description>
        <origin>
            <time>
                <value>2019-02-21T23:49:44.800Z</value>
            </time>
            <longitude>
                <value>-121.805</value>
            </longitude>
            <latitude>
                <value>37.8538333</value>
            </latitude>
            <evaluationMode>manual</evaluationMode>
            <creationInfo>
                <agencyID>NC</agencyID>
                <creationTime>2019-02-22T00:08:10.440Z</creationTime>
                <version>4</version>
            </creationInfo>
        </origin>
        <magnitude>
            <mag>
                <value>2.05</value>
                <uncertainty>0.205</uncertainty>
            </mag>
            <type>md</type>
            <stationCount>36</stationCount>
            <originID>quakeml:earthquake/product.xml</originID>
            <evaluationMode>manual</evaluationMode>
            <creationInfo>
                <agencyID>NC</agencyID>
                <creationTime>2019-02-22T00:08:10.440Z</creationTime>
            </creationInfo>
        </magnitude>
        <type>earthquake</type>
        <creationInfo>
            <agencyID>nc</agencyID>
            <creationTime>2019-02-22T04:37:04.668Z</creationTime>
            <version>4</version>
        </creationInfo>
    </event>
    <more events here...../>
</root>

Мне нужно убрать этот документ только из тех элементов, которые мне нужны.В примере XML допустим, что я хочу удалить узлы creationInfo из обоих origin и magnitude в каждом из событий в дополнение ко множеству других узлов,В идеале я хотел бы отфильтровать узлы на основе списка разрешенных имен узлов.Я использую XmlSlurper для анализа входящего XML, создания карты, а затем использую JsonOutput для создания JSON.Я упоминаю об этом, потому что думаю, что я мог бы также извлечь узлы из Map или объекта JsonOutput, если это проще.Я успешно удалил один целевой узел с помощью метода replaceNode:

root.event.description.replaceNode { }

К сожалению, это приведет к удалению только одного узла, на самом деле, это приведет к сбою в моем примере XML, если у меня будет более одного события.Я думаю, что ответом будет итерация по моему XML, создание коллекции узлов, которые я хочу удалить, и затем итерация по этой коллекции для удаления узлов по отдельности.Любые примеры или альтернативные подходы будут оценены.

...