1

当一个简单的示例运行良好时,我在以编程方式使用 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
  } )
4

1 回答 1

-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" }

更多信息

于 2014-03-13T15:03:22.130 回答