Groovy处理XML时如何正确保留prod节点的子节点结构?
解决Groovy XML格式化中prod子节点缺失问题
你的问题核心是没有正确复制prod节点的子元素,直接引用原节点只会复用结构但不会深拷贝子节点。以下是修改思路和代码示例:
错误原因
新手常犯的错误是直接把原XML中的prod节点放到新节点里,但Groovy的XmlSlurper/MarkupBuilder处理节点时,直接引用只会处理属性,不会自动复制子节点。
修改后的代码
// 示例输入XML def inputXml = '''<root> <orderstartdate>2024-01-01</orderstartdate> <StartDate>2024-01-03</StartDate> <prod> <id>123</id> <count>5</count> </prod> </root>''' // 解析原始XML def xml = new XmlSlurper().parseText(inputXml) def startDate = Date.parse("yyyy-MM-dd", xml.orderstartdate.text()) def endDate = Date.parse("yyyy-MM-dd", xml.StartDate.text()) // 构建新XML def newXmlBuilder = new groovy.xml.MarkupBuilder() newXmlBuilder.root { // 遍历日期区间生成results节点 (startDate..endDate).each { currentDate -> results(date: currentDate.format("yyyy-MM-dd")) { // 手动构建prod节点并复制所有子节点 prod { xml.prod.children().each { childNode -> // 动态创建子节点并赋值文本内容 "${childNode.name()}"(childNode.text()) } } } } }
关键改动点
- 不再直接引用原
xml.prod,而是遍历它的所有子节点(children()) - 动态创建每个子节点(比如id、count)并填充原节点的文本内容
- 确保每个results节点下的prod都完整包含id和count子元素
验证输出
运行后会生成每个日期对应的results节点,每个prod下都会有正确的id和count:
<root> <results date='2024-01-01'> <prod> <id>123</id> <count>5</count> </prod> </results> <results date='2024-01-02'> <prod> <id>123</id> <count>5</count> </prod> </results> <results date='2024-01-03'> <prod> <id>123</id> <count>5</count> </prod> </results> </root>
内容的提问来源于stack exchange,提问作者N21RL
相关产品推荐
相关产品推荐

