Frage

zum Beispiel, ich habe das folgende XML-Dokument:

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>
'''

und ich möchte das Auto „Royale“ bis zu ersten bewegen, und legen Sie ein neues Auto kurz nach dem Auto „HSV Maloo“, wäre das Ergebnis:

'''
    <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>
'''

Wie es mit Groovy zu tun? Kommentare sind willkommen.

War es hilfreich?

Lösung

Ich ging einen ähnlichen Weg zu DanB nach unten, sondern lief in Probleme, wenn tatsächlich die resultierenden XML-Ausdrucken. Dann erkannte ich, dass die NodeList, indem er die Wurzel für all seine „Auto“ Kinder ist nicht die gleiche Liste zurückgegeben wurde, wie Sie, indem Sie gerade fragen, für die Wurzel Kinder bekommen. Auch wenn sie die gleichen Listen in diesem Fall geschehen sein, würden sie nicht immer, wenn es nicht „Auto“ Kinder unter dem Stamm waren. Aus diesem Grunde, hat Reording die Liste der Autos, die wieder aus der Abfrage kommt nicht die erste Liste beeinflussen.

Hier ist eine Lösung, die anfügt und Nachbestellungen:

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)

Die Behauptung mit den propertly bestellen Autos geht, und die XmlNodePrinter Ausgänge:

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

Andere Tipps

ted, vielleicht hast du nicht bemerkt, dass ich wollte ‚auf‚‘‚ein neues Auto legen Sie einfach nach dem Auto ‚HSV Maloo‘‘‘, so dass ich den Code ändern, um:

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

new XmlNodePrinter().print(carRecords)

Jetzt funktioniert es mit dem richtigen Reihenfolge! dank DanB & ted.

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

diese sind nicht die Codz Sie suchen

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']))

Ich weiß nicht, ob es ein intelligenter Weg, neuen Knoten zu schaffen ... aber das funktioniert für mich.

EDIT: UHG ... Danke Jungs ... Ich habe faul und carNodes druckte, wenn ich dies anstelle der Wurzel getestet ... igitt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top