gpt4 book ai didi

xpath - 在Groovy中使用Xpath删除XML中的节点

转载 作者:行者123 更新时间:2023-12-03 16:06:29 24 4
gpt4 key购买 nike

我已经使用了Groovy代码来使用xpath字符串删除节点,但是在删除xpath导致多个节点实例的节点时遇到了问题。

XML示例...

<root>
<element1>foo</element1>
<element2>bar</element2>
<items>
<item>
<name>a</name>
<desc>b</desc>
<item>
<item>
<name>c</name>
<desc>x</desc>
</item>
</items>
</root>


代码删除节点...

def resource = XmlSlurper().parseText(xml)
def xpathsToDelete = ['/root/element1','/root/items/item/name']
xpathsToDelete.each {
def pathTokens = it.path.tokenize '/'
def currentNode = resource
if ( currentNode.name() == pathTokens.first() ) {
def xpath = pathTokens.tail().join '/'
currentNode = currentNode."${xpath}"
currentNode.replaceNode{}
}
}


上面的代码使用xpath element1删除了节点 /root/element1,xpath /root/items/name评估为单个节点,但不适用于 评估为多个节点。

最佳答案

这是一个棘手的问题。它与this question有关,这对我的回答至关重要。

这是一个解决方案:

import groovy.util.* 
import groovy.xml.*

def xml = """<root>
<element1>foo</element1>
<element2>bar</element2>
<items>
<item>
<name>a</name>
<desc>b</desc>
</item>
<item>
<name>c</name>
<desc>x</desc>
</item>
</items>
</root>"""

def removeNodes = { doc, path ->
def nodes = doc
path.split("\\.").each { nodes = nodes."${it}" }
nodes.each { it.replaceNode{} }
}

def resource = new XmlSlurper().parseText(xml)
def xpathsToDelete = ['/root/element1','/root/items/item/name']

xpathsToDelete.each { xpath ->
def trimXPath = xpath.replaceFirst( "/root/", "").replace("/",".")
removeNodes(resource, trimXPath)
}

println XmlUtil.serialize(new StreamingMarkupBuilder().bind {
mkp.yield resource
})

关于xpath - 在Groovy中使用Xpath删除XML中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com