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

时间:2012-06-21 07:56:09

标签: groovy

我很不熟悉并寻求你的帮助。 我想读取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)

1 个答案:

答案 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来解析你的文件,而不是我在这里的字符串,并将输出更改回写入文件...

希望它有所帮助!