我很不熟悉并寻求你的帮助。 我想读取delta xml文件并根据name属性更新master xml文件。两个xml文件都具有相同的结构。我正在尝试更新master xml文件中的属性值。但主文件一旦空白,文件就会更新。我不确定我错在哪里。
下面是xml结构:
<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" />
以下是此代码:
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)
答案 0 :(得分:0)
好的,给出两个示例xml文档:
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):
def templatexmlConfig = new XmlParser().parseText( templateXml )
def basexmlConfig = new XmlParser().parseText( baseXml )
然后获取item-descriptor
个节点(就像你拥有它一样)
def templateItemDesNode = templatexmlConfig.'item-descriptor'
def baseItemDesNode = basexmlConfig.'item-descriptor'
然后,遍历模板item-descriptors
,生成非名称属性的映射(使用findAll
比您拥有的循环更容易),并替换{{1中的节点上的所有节点同名:
baseXml
对于这个易于运行的例子,只需打印出Xml:
templateItemDesNode.each() { tidn ->
Map bindings = tidn.attributes().findAll { it.key != 'name' }
def nameAttr = tidn.@name
baseItemDesNode.find { b -> b.@name == nameAttr }?.with { node ->
bindings.each { a, v ->
node.@"$a" = v
}
}
}
运行时,上面打印出来:
println new StringWriter().with { sw ->
new XmlNodePrinter( new PrintWriter( sw ) ).print(basexmlConfig)
sw.toString()
}
显然,对于你的工作代码,你需要回到使用<xml>
<item-descriptor name="b" cache-mode="r2" item-cache-size="2" new-attr="tim"/>
<item-descriptor name="c" cache-mode="o2" item-cache-size="11"/>
<item-descriptor name="a" cache-mode="r1" item-cache-size="1"/>
</xml>
上的parse
来解析你的文件,而不是我在这里的字符串,并将输出更改回写入文件...
希望它有所帮助!