2008-10-22 13 views
12

zum Beispiel habe ich das folgende XML-Dokument:Wie Einfügen/Verschieben/Löschen von Knoten in Xml mit Groovy?

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 bis zum ersten man das Auto „Royale“ bewegen, und ein neues Auto legen Sie einfach nach dem Auto „HSV Maloo“, das Ergebnis würde be:

''' 
    <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 geht es mit Groovy? Kommentare sind willkommen.

Antwort

12

Ich ging einen ähnlichen Weg zu danb, aber lief auf Probleme, wenn tatsächlich das resultierende XML gedruckt wurde. Dann erkannte ich, dass die NodeList, die zurückgegeben wurde, indem man die Wurzel für alle "Auto" -Kinder anfragte, nicht dieselbe Liste war, wie man sie erhält, wenn man einfach nach den Kindern der Wurzel fragt. Obwohl sie in diesem Fall die gleichen Listen sind, wären sie nicht immer, wenn es nicht "Auto" -Kinder unter der Wurzel gäbe. Aus diesem Grund wirkt sich das Auflisten der Autos, die von der Abfrage zurückkommen, nicht auf die ursprüngliche Liste aus.

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

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 { [email protected] == '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*[email protected] 

new XmlNodePrinter().print(carRecords) 

Die Behauptung mit den propertly bestellten 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> 
2

< Hand-Welle> diese sind nicht die Codz Sie suchen </Hand-Welle>

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, neue Knoten zu erstellen ... aber das funktioniert für mich.

EDIT: uhg ... danke Jungs ... Ich wurde faul und druckte carNodes, wenn ich dies anstelle der Wurzel getestet ... yikes.

+0

Hallo danb, ich versuche es mit XmlNodePrinter zu drucken, aber es erscheint in falscher Reihenfolge. flyisland

+0

Ich wollte gerade dasselbe sagen ... es sieht so aus, als würde es die Elemente in der NodeList neu anordnen, Aber das spiegelt sich nicht in der Art und Weise wider, wie der Wurzelknoten vom XmlNodePrinter durchlaufen wird. –

+0

yup ... Ich war so schlampig. Danke! – danb

5

ted, vielleicht merkt man nicht, dass ich wollte, um ein neues Auto nach dem Auto "HSV Maloo" einzufügen, so ändere ich Ihren Code zu:

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

new XmlNodePrinter().print(carRecords) 

jetzt, es funktioniert mit der richtigen Reihenfolge! danke dan & 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> 
+0

Ja, das habe ich verpasst, oops :). Ich dachte, du wolltest es zuletzt, aber Der Code, den Sie haben, ist richtig, um es auf den 3. Platz zu bekommen. –