1

我对 groovy 很陌生,并寻求您的帮助。我想读取一个 delta xml 文件并根据 name 属性更新主 xml 文件。两个 xml 文件具有相同的结构。我正在尝试更新主 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)
4

1 回答 1

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比循环更容易),并用baseXml相同的名称替换节点上的所有节点:

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:

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>

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

希望能帮助到你!

于 2012-06-21T08:30:15.367 回答