在Groovy中计算XML属性

时间:2016-06-24 18:08:01

标签: groovy

所以我在Groovy中创建一个脚本来解析一个非常大的XML文件,附加一些东西并在每次附加时略微更改每个元素。这些元素中的每一个都有一个与之关联的ID号,我想这样做,以便每次附加一个元素时,ID号将=文件+1中的最高ID号。我将展示一小段代码,以帮助理解:

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="xyxy" version="1.1">
  <file original="zzz.js" source-language="en" target-language="en" datatype="javascript">
    <body>
    <trans-unit id="20" resname="foo">
        <source>foofoo</source>
        <target>foofoo</target>
      </trans-unit>
      <trans-unit id="21" resname="blah">
        <source>blahblah</source>
        <target>blahblah</target>
      </trans-unit>
     </body>
  </file>
</xliff>

在这种情况下,如果我在列表中添加了一个元素(trans-unit),那么ID必须是22.我有一个解析和追加的算法,但我不知道如何增加每个ID时间。我再次使用Groovy来做到这一点。有没有人有想法?在此先感谢!!

1 个答案:

答案 0 :(得分:0)

假设您已使用xmlslurper或xmlparser解析了该XML,您应该可以在max的帮助下获取下一个ID:

def xml = '''<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="xyxy" version="1.1">
  <file original="zzz.js" source-language="en" target-language="en" datatype="javascript">
    <body>
    <trans-unit id="20" resname="foo">
        <source>foofoo</source>
        <target>foofoo</target>
      </trans-unit>
      <trans-unit id="21" resname="blah">
        <source>blahblah</source>
        <target>blahblah</target>
      </trans-unit>
     </body>
  </file>
</xliff>'''

def x = new XmlSlurper().parseText(xml)
def next = 1 + x.file.body.'trans-unit'*.@id*.text().collect { it as Integer }.max()

assert next == 22

要使用XmlParser,您需要将行更改为:

def next = 1 + x.file.body.'trans-unit'*.@id.collect { it as Integer }.max()