我有一个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,创建要删除的节点的集合,然后遍历该集合以分别删除节点。任何示例或替代方法将被理解。