2008-10-22 67 views
12

por ejemplo, tengo el siguiente documento XML:¿Cómo insertar/mover/eliminar nodos en xml con 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> 
    ''' 

y quiero mover el coche "Royale" hasta primero de ellos, e insertar un coche nuevo justo después de coche "HSV Maloo", el resultado sería ser:

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

¿Cómo hacerlo con Groovy? los comentarios son bienvenidos

Respuesta

12

Bajé por una ruta similar a danb, pero tuve problemas cuando imprimí el XML resultante. Luego me di cuenta de que la NodeList que devolvió preguntando a la raíz de todos sus hijos "car" no es la misma lista que se obtiene simplemente preguntando por los hijos de la raíz. Aunque resulten ser las mismas listas en este caso, no siempre lo serían si hubiera niños que no pertenezcan al "automóvil" en la raíz. Debido a esto, reescribir la lista de autos que regresan de la consulta no afecta la lista inicial.

he aquí una solución que anexa y reordena:

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) 

La afirmación con los coches propertly ordenados pasa, y las salidas 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> 
2

< mano de onda> estos no son los Codz que buscan </de la mano de onda>

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

No sé si hay una forma más inteligente para crear nuevos nodos ... pero eso funciona para mí

EDIT: uhg ... gracias chicos ... Me puse vago y estaba imprimiendo carNodes cuando probé esto en lugar de la raíz ... yikes.

+0

Hola, danb, intento imprimirlo con XmlNodePrinter, pero aparece en el orden incorrecto. flyisland

+0

Estaba a punto de decir lo mismo ... parece que está reordenando los artículos en NodeList, pero eso no se refleja en la forma en que el nodo raíz es iterado por XmlNodePrinter. –

+0

yup ... ¡Estaba muy descuidado! ¡Gracias! – danb

5

ted, tal vez no se dio cuenta de que quería para '' 'insertar un nuevo automóvil justo después del automóvil "HSV Maloo"' '', entonces modifico su código a:

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

new XmlNodePrinter().print(carRecords) 

ahora, funciona con el orden correcto gracias a 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> 
+0

Sí, me lo perdí, vaya :). Estaba pensando que lo querías al final, pero el código que tienes es correcto para obtenerlo en el 3er lugar. –

Cuestiones relacionadas