Xml goes blank, when updated with Groovy XmlParser
我对 groovy 很陌生,并寻求您的帮助。
我想读取一个 delta xml 文件并根据 name 属性更新主 xml 文件。两个 xml 文件具有相同的结构。我正在尝试更新主 xml 文件中的属性值。但是主文件一旦变为空白,文件就会更新。我不确定我错在哪里。
下面是xml结构:
1 2 | <item-descriptor name="user" cache-mode="simple" item-cache-size="3000" query-cache-size="1000" item-cache-timeout="900000" query-expire-timeout="60000" /> <item-descriptor name="contactInfo" cache-mode="simple" item-cache-size="10000" query-cache-size="1000" item-cache-timeout="900000" query-expire-timeout="60000" /> |
下面是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | def templatexmlConfig = new XmlParser().parse(templateConfigFile) def basexmlConfig = new XmlSlurper().parse(baseConfigFile) def templateItemDesNode = templatexmlConfig.'item-descriptor' def baseItemDesNode=basexmlConfig.'item-descriptor' templateItemDesNode.each() { Map bindings=[:] def nameAttr=it.attribute('name') it.attributes().each{attrName,attrValue-> if(!attrName.equals('name')) { bindings.put(attrName,attrValue) }} if(baseItemDesNode.find{ it.@name.text().equals(nameAttr)}.size()!=0) { bindings.each { def a=it.key def v=it.value baseItemDesNode.find{ it.@name.text().equals(nameAttr)}.@'a'="${v}" } } } new XmlNodePrinter(new PrintWriter(outputFile)).print(basexmlConfig) |
好的,给定两个示例 xml 文档:
1 2 3 4 5 6 7 8 9 10 | def templateXml = '''<xml> | <item-descriptor name="a" cache-mode="r1" item-cache-size="1"/> | <item-descriptor name="b" cache-mode="r2" item-cache-size="2" new-attr="tim"/> | <item-descriptor name="z" cache-mode="r3" item-cache-size="3"/> |</xml>'''.stripMargin() ; def baseXml = '''<xml> | <item-descriptor name="b" cache-mode="o1" item-cache-size="10"/> | <item-descriptor name="c" cache-mode="o2" item-cache-size="11"/> | <item-descriptor name="a" cache-mode="o3" item-cache-size="12"/> |</xml>'''.stripMargin() |
我们可以解析这些(两者都使用 XmlParser,你有一个解析器,另一个有 slurper):
1 2 |
然后得到
1 2 |
然后,遍历模板
1 2 3 4 5 6 7 8 9 |
对于这个易于运行的示例,只需打印出 Xml:
1 2 3 4 | println new StringWriter().with { sw -> new XmlNodePrinter( new PrintWriter( sw ) ).print(basexmlConfig) sw.toString() } |
当运行时,上面会打印出:
1 2 3 4 5 |
显然,对于您的工作代码,您需要返回在
希望对你有帮助!