如何使用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
相关产品推荐
相关产品推荐

