使用Groovy附加到xml文件的属性值

时间:2015-10-02 19:12:25

标签: xml grails groovy

xml的一个例子:

<response version-api="2.0">
    <value>
        <books>
            <book available="20" id="1" tags="">
                <title>Don Xijote</title>
                <author id="1" tags="Joel">Manuel De Cervantes</author>
            </book>
            <book available="14" id="2" tags"Jane">
                <title>Catcher in the Rye</title>
               <author id="2" tags="">JD Salinger</author>
           </book>
           <book available="13" id="3" tags="">
               <title>Alice in Wonderland</title>
               <author id="3">Lewis Carroll</author>
           </book>
           <book available="5" id="4" tags="Harry">
               <title>Don Xijote</title>
               <author id="4">Manuel De Cervantes</author>
           </book>
       </books>
   </value>
</response>

基本上我试图将我选择的字符串值附加到所有名为“tags”的属性。这是“tags”属性是否具有值,并且属性是否位于xml结构的不同级别。我已经尝试了方法appendNode()但是吐出了一个groovy运行时表达式错误。我也看过这个http://blog.thefourthparty.com/stopping-time-in-postgresql/,但我没有接近我需要的答案。这是代码:

    def rootFolder = new File('.').getCanonicalPath()
    def response = new XmlSlurper().parse(new File(rootFolder + File.separator + 'src' + File.separator + 'metadata.xml'))
    def tags = response.'**'.findAll { it['@tags']!='' }

    tags.each{ t ->
        def tagAttr =  (t.@tags.value.toString())
        println(tagAttr)
    }

任何人都知道如何实现这个目标?

2 个答案:

答案 0 :(得分:0)

你几乎得到了......这应该做你想要的(假设我有正确的结束):

def xml = '''<response version-api="2.0">
            |    <value>
            |        <books>
            |            <book available="20" id="1" tags="">
            |                <title>Don Xijote</title>
            |                <author id="1" tags="Joel">Manuel De Cervantes</author>
            |            </book>
            |            <book available="14" id="2" tags="Jane">
            |                <title>Catcher in the Rye</title>
            |               <author id="2" tags="">JD Salinger</author>
            |           </book>
            |           <book available="13" id="3" tags="">
            |               <title>Alice in Wonderland</title>
            |               <author id="3">Lewis Carroll</author>
            |           </book>
            |           <book available="5" id="4" tags="Harry">
            |               <title>Don Xijote</title>
            |               <author id="4">Manuel De Cervantes</author>
            |           </book>
            |       </books>
            |   </value>
            |</response>'''.stripMargin()

import groovy.xml.*

def parsed = new XmlParser().parseText(xml)        

parsed.'**'
      .findAll { 'tags' in it.attributes().keySet().toList() }
      .each { it.@tags += (it.@tags ? ' ' : '') + 'extraTag' }

println XmlUtil.serialize(parsed)

答案 1 :(得分:0)

您可以使用XmlParser(而不是XmlSlurper)。

import groovy.util.XmlParser

def input = '''
<response version-api="2.0">
    <value>
        <books>
            <book available="20" id="1" tags="">
                <title>Don Xijote</title>
                <author id="1" tags="Joel">Manuel De Cervantes</author>
            </book>
            <book available="14" id="2" tags="Jane">
                <title>Catcher in the Rye</title>
               <author id="2" tags="">JD Salinger</author>
           </book>
           <book available="13" id="3" tags="">
               <title>Alice in Wonderland</title>
               <author id="3">Lewis Carroll</author>
           </book>
           <book available="5" id="4" tags="Harry">
               <title>Don Xijote</title>
               <author id="4">Manuel De Cervantes</author>
           </book>
       </books>
   </value>
</response>
'''

def xml = new XmlParser().parseText(input)

xml.'**'.findAll { if(it.@tags != null) it.@tags = it.@tags + '-hello' }

findAll()之后,将修改标签属性。