Groovy:从文档中删除许多XML节点

时间:2019-03-01 14:25:52

标签: xml groovy apache-nifi

我有一个Groovy脚本,该脚本从Web服务获取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中,我想说除了所有事件之外,我还希望从每个事件的 origin magnitude 中删除 creationInfo 节点其他节点。理想情况下,我想根据允许的节点名称列表过滤节点。我正在使用XmlSlurper解析传入的XML,创建一个Map,然后使用JsonOutput创建JSON。我之所以这样提及,是因为我认为我也可以从Map或JsonOutput对象中拉出节点,如果这样更容易的话。我已经使用replaceNode方法成功删除了单个目标节点:

root.event.description.replaceNode { }

不幸的是,这只会删除一个节点,实际上,如果我有多个事件,则在示例XML上将失败。我认为答案是遍历我的XML,创建要删除的节点的集合,然后遍历该集合以分别删除节点。任何示例或替代方法将被理解。

0 个答案:

没有答案