求助:使用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
代码说明
XmlParser.parseText()解析输入XML,生成节点树结构- 通过Groovy的链式节点访问
root.result.emailClick直接定位目标节点 XmlNodePrinter负责节点到格式化XML文本的转换,preserveWhitespace参数保证输出保留原有的换行和缩进,默认不会输出XML声明- 遍历并打印所有
emailClick节点,即可得到需求的输出格式
内容的提问来源于stack exchange,提问作者sabyasachi
相关产品推荐
相关产品推荐

