使用 Groovy XmlParser 更新时,Xml 变为空白

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
def templatexmlConfig = new XmlParser().parseText( templateXml )
def basexmlConfig = new XmlParser().parseText( baseXml )

然后得到 item-descriptor 节点(如你所愿)

1
2
def templateItemDesNode = templatexmlConfig.'item-descriptor'
def baseItemDesNode = basexmlConfig.'item-descriptor'

然后,遍历模板item-descriptors,生成一个非名称属性的映射(使用findAll比你有的循环更容易),并将baseXml中节点上的所有节点替换为相同名称:

1
2
3
4
5
6
7
8
9
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
    }
  }
}

对于这个易于运行的示例,只需打印出 Xml:

1
2
3
4
println new StringWriter().with { sw ->
  new XmlNodePrinter( new PrintWriter( sw ) ).print(basexmlConfig)
  sw.toString()
}

当运行时,上面会打印出:

1
2
3
4
5
<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>

显然,对于您的工作代码,您需要返回在 XmlParsers 上使用 parse 来解析您的文件,而不是我在这里的字符串,并将输出更改回写入文件...

希望对你有帮助!