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 が、ルートの子を要求するだけで得られるリストと同じではないことに気付きました。この場合、たまたま同じリストであったとしても、ルートの下に「car」以外の子があった場合は、常に同じになるとは限りません。このため、クエリから返された車のリストを並べ替えても、最初のリストには影響しません。

追加して並べ替えるソリューションは次のとおりです。

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

ted さん、私が '''car"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を印刷していました...yikes。

于 2008-10-22T20:42:25.177 に答える