Groovy XmlSlurper replaceNode不适用于找到的节点

时间:2014-01-09 18:05:36

标签: groovy xmlslurper

当一个简单的例子工作正常时,我遇到了以编程方式使用replaceNode的问题。

在之前的一个问题的基础上,这段代码可以运行,但是换掉了标记为SWAP的行并且它会中断。

有人能告诉我如何使用find {}调用返回的节点进行此工作吗?

package com.az.util.test

import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil

def CAR_RECORDS = '''
    <records>
      <car name='HSV Maloo' make='Holden' year='2006'>
        <country>Australia</country>
        <record type='speed'>Production Pickup Truck with speed of 271kph</record>
      </car>
      <car name='P50' make='Peel' year='1962'>
        <country>Isle of Man</country>
        <record type='size'>Smallest Street-Legal Car at 99cm wide and 59 kg in weight</record>
      </car>
      <car name='Royale' make='Bugatti' year='1931'>
        <country>France</country>
        <record type='price'>Most Valuable Car at $15 million</record>
      </car>
    </records>
  '''

def records = new XmlSlurper().parseText(CAR_RECORDS)

def allRecords = records.car

assert 3 == allRecords.size()

def firstRecord = records.car[0]

assert 'car' == firstRecord.name()

println 'country before: ' + firstRecord.'country'.text()

def secondRecord = records.car[1]

// SWAP
//firstRecord.'country'.replaceNode {secondRecord.country}
firstRecord.'country'.replaceNode {country("Isle of Man")}

records = new XmlSlurper().parseText(XmlUtil.serialize(new StreamingMarkupBuilder().bind {
    mkp.yield records
  } ))

println 'country after: ' + records.car.country.find{ true }.text() 

println XmlUtil.serialize(new StreamingMarkupBuilder().bind {
    mkp.yield records
  } )

1 个答案:

答案 0 :(得分:-1)

将XmlSlurper与groovy一起使用,它与XPath完美配合:

def xmlDoc = """<parent>
    <child>
      <child1>
        <subchild1>sub1</subchild1>
      </child1>
    </child>
  <child>  
  <child2>
    <subchild2>sub2</subchild2>
  </child2>
  </child>  
</parent>"""


def sl = new XmlSlurper().parseText(xmlDoc)
def childsRecords = sl.child

childsRecords.child1.subchild1.each { println "$it" }

More info