You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Groovy删除指定XML标签及其空父标签?

用Groovy移除XML中包含特定数字的标签及其所有父标签

实现思路

先精准定位到包含文本123456789的<Id>节点,再从该节点开始向上遍历所有父节点,依次移除空的父节点,直到遇到非空父节点或根节点为止。

代码示例

def xmlContent = '''
<root>
  <SampleNode>保留的内容</SampleNode>
  <CdtrAcct>
    <Id>
      <Othr>
        <Id>123456789</Id>
      </Othr>
    </Id>
  </CdtrAcct>
  <AnotherNode>其他内容</AnotherNode>
</root>
'''

// 解析XML
def parser = new XmlParser()
def root = parser.parseText(xmlContent)

// 定位目标节点:文本精确匹配123456789的Id标签
def targetNode = root.depthFirst().find { node ->
    node.name() == 'Id' && node.text().trim() == '123456789'
}

if (targetNode) {
    def currentNode = targetNode
    // 向上遍历父节点,移除空节点链
    while (currentNode.parent() != root) {
        def parent = currentNode.parent()
        parent.remove(currentNode)
        // 父节点为空则继续向上处理,否则停止
        currentNode = parent.children().isEmpty() ? parent : null
        if (!currentNode) break
    }
    // 最后移除根节点下的空节点(如果存在)
    if (currentNode?.parent() == root && currentNode.children().isEmpty()) {
        root.remove(currentNode)
    }
}

// 输出处理后的XML
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
println writer.toString()

关键说明

  • 选用XmlParser而非XmlSlurper,因为前者支持修改XML节点结构
  • depthFirst()方法遍历所有节点,能快速定位深层嵌套的目标节点
  • 用trim()处理节点文本,避免因换行、空格导致匹配失败
  • 循环处理父节点时,仅移除空父节点,不会误删包含其他内容的节点
  • 若要处理多个符合条件的节点,将find改为findAll后循环遍历即可

内容的提问来源于stack exchange,提问作者Laki Roske

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:52:48