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

标签 xpath groovy gpath

我有这个 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 /root/element1 删除节点 element1,其计算结果为单个节点,但不适用于 /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/

相关文章:

python - scrapy xpath选择器可以在浏览器中使用,但不能在crawl或shell中使用

Java使用xpath获取xml元素值 "And"

selenium - 选择不同的网页元素

groovy - 如何指定到列表末尾的范围?

java - 为什么 .settings 文件丢失

groovy - 使用 XmlSlurper 和 findAll 的嵌套 GPath 表达式

java - Selenium Web 驱动程序 - 无法找到元素

groovy - 如何使用 groupby 在 Groovy 中为 map 值选择对象字段

xml - 使用动态 GPath 表达式按属性值查找 XML 元素