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

求助:使用Groovy脚本移除XML声明与父节点仅保留子节点

解决Groovy转换XML提取子节点的问题

需求说明

输入XML:

<?xml version="1.0" encoding="UTF-8"?>  
<rsp stat="ok" version="1.0">
<result>
<total_results>700</total_results>
<emailClick>
<id>993</id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>
<emailClick>
<id>995</id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>
</result>
</rsp>

需要提取所有<emailClick>节点,移除XML声明和父标签,输出如下:

<emailClick>
<id>993</id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>
<emailClick>
<id>995</id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>

正确的Groovy实现代码

可以使用XmlParser结合XmlNodePrinter处理,避免直接转换字符串的错误:

def xmlInput = '''<?xml version="1.0" encoding="UTF-8"?>  
<rsp stat="ok" version="1.0">
<result>
<total_results>700</total_results>
<emailClick>
<id>993</id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>
<emailClick>
<id>995</id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>
</result>
</rsp>'''

def parser = new XmlParser()
def root = parser.parseText(xmlInput)

// 获取所有emailClick节点
def emailClicks = root.result.emailClick

// 配置XmlNodePrinter,保持缩进且不输出XML声明
def printer = new XmlNodePrinter(new PrintWriter(System.out))
printer.preserveWhitespace = true

// 逐个打印目标节点
emailClicks.each { printer.print(it) }

扩展:将结果保存为字符串

如果不需要直接打印,而是要得到输出字符串,可改用StringWriter:

def writer = new StringWriter()
def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.preserveWhitespace = true

emailClicks.each { printer.print(it) }
def xmlOutput = writer.toString()
println xmlOutput

代码说明

  1. XmlParser.parseText()解析输入XML,生成节点树结构
  2. 通过Groovy的链式节点访问root.result.emailClick直接定位目标节点
  3. XmlNodePrinter负责节点到格式化XML文本的转换,preserveWhitespace参数保证输出保留原有的换行和缩进,默认不会输出XML声明
  4. 遍历并打印所有emailClick节点,即可得到需求的输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:44