13

例如,我有以下 xml 文档:

def CAR_RECORDS = '''
    <records>
      <car name='HSV Maloo' make='Holden' year='2006'/>
      <car name='P50' make='Peel' year='1962'/>
      <car name='Royale' make='Bugatti' year='1931'/>
    </records>
'''

我想将汽车“Royale”移动到第一个,并在汽车“HSV Maloo”之后插入一辆新车,结果将是:

'''
    <records>
      <car name='Royale' make='Bugatti' year='1931'/>
      <car name='HSV Maloo' make='Holden' year='2006'/>
      <car name='My New Car' make='Peel' year='1962'/>
      <car name='P50' make='Peel' year='1962'/>
    </records>
'''

如何用 Groovy 做到这一点?欢迎评论。

4

3 回答 3

13

我走了一条类似的路线到 danb,但在实际打印出生成的 XML 时遇到了问题。然后我意识到,通过向根询问它的所有“汽车”孩子返回的 NodeList 与通过询问根的孩子得到的列表不同。即使在这种情况下它们碰巧是相同的列表,但如果根目录下有非“汽车”子级,它们也不会总是如此。因此,重新排列从查询返回的汽车列表不会影响初始列表。

这是一个附加和重新排序的解决方案:

def CAR_RECORDS = '''
   <records>
     <car name='HSV Maloo' make='Holden' year='2006'/>
     <car name='P50' make='Peel' year='1962'/>
     <car name='Royale' make='Bugatti' year='1931'/>
   </records>
 '''

def carRecords = new XmlParser().parseText(CAR_RECORDS)

def cars = carRecords.children()
def royale = cars.find { it.@name == 'Royale' } 
cars.remove(royale)
cars.add(0, royale)
def newCar = new Node(carRecords, 'car', [name:'My New Car', make:'Peel', year:'1962'])

assert ["Royale", "HSV Maloo", "P50", "My New Car"] == carRecords.car*.@name

new XmlNodePrinter().print(carRecords)

正确排序的汽车的断言通过,XmlNodePrinter 输出:

<records>
  <car year="1931" make="Bugatti" name="Royale"/>
  <car year="2006" make="Holden" name="HSV Maloo"/>
  <car year="1962" make="Peel" name="P50"/>
  <car name="My New Car" make="Peel" year="1962"/>
</records>
于 2008-10-23T04:08:16.697 回答
6

特德,也许你没有注意到我想'''在汽车“HSV Maloo”'''之后插入一辆新车,所以我将你的代码修改为:

def newCar = new Node(null, 'car', [name:'My New Car', make:'Peel', year:'1962'])
cars.add(2, newCar)

new XmlNodePrinter().print(carRecords)

现在,它以正确的顺序工作!感谢丹布和泰德。

<records>
  <car year="1931" make="Bugatti" name="Royale"/>
  <car year="2006" make="Holden" name="HSV Maloo"/>
  <car name="My New Car" make="Peel" year="1962"/>
  <car year="1962" make="Peel" name="P50"/>
</records>
于 2008-10-23T08:06:52.970 回答
2

<hand-wave> 这些不是你想要的 </hand-wave>

Node root = new XmlParser().parseText(CAR_RECORDS)
NodeList carNodes = root.car
Node royale = carNodes[2]
carNodes.remove(royale)
carNodes.add(0, royale)
carNodes.add(2, new Node(root, 'car', [name:'My New Card', make:'Peel', year:'1962']))

我不知道是否有更聪明的方法来创建新节点......但这对我有用。

编辑:呃...谢谢大家...当我测试这个而不是根目录时,我变得懒惰并且正在打印carNodes...哎呀。

于 2008-10-22T20:42:25.177 回答