Pregunta

por ejemplo, tengo el siguiente documento 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>
'''

y quiero mover el auto " Royale " hasta el primero e inserte un auto nuevo justo después del auto " HSV Maloo " ;, el resultado sería:

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

¿Fue útil?

Solución

Seguí una ruta similar a danb, pero tuve problemas al imprimir el XML resultante. Luego me di cuenta de que la NodeList que se devolvió preguntando a la raíz por todo & Quot; car & Quot; children no es la misma lista que obtienes simplemente preguntando por los hijos de la raíz. Aunque resulten ser las mismas listas en este caso, no siempre lo serían si no hubiera & Quot; car & Quot; niños debajo de la raíz. Debido a esto, regrabar la lista de autos que regresan de la consulta no afecta la lista inicial.

Aquí hay una solución que se agrega 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 { 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)

La afirmación con los autos ordenados de manera apropiada pasa, y el XmlNodePrinter genera:

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

Otros consejos

ted, tal vez no te diste cuenta de que quería '' 'insertar un auto nuevo justo después del auto " HSV Maloo "' '', así que modifico tu 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 & amp; 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>

< mano-onda > estos no son los codz que buscas < / 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']))

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

EDITAR: uhg ... gracias chicos ... Me volví perezoso y estaba imprimiendo carNodes cuando probé esto en lugar de la raíz ... yikes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top