Domanda

ad esempio, ho il seguente 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>
'''

e voglio spostare la macchina " Royale " fino alla prima e inserisci una nuova auto subito dopo l'auto " HSV Maloo " il risultato sarebbe:

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

Come farlo con Groovy? i commenti sono ben accetti.

È stato utile?

Soluzione

Ho seguito una strada simile a danb, ma ho riscontrato problemi durante la stampa dell'XML risultante. Poi mi sono reso conto che il NodeList che era stato restituito chiedendo alla radice tutto il suo & Quot; car & Quot; figli non è la stessa lista che ottieni chiedendo solo i figli della radice. Anche se in questo caso sono le stesse liste, non lo sarebbero sempre se non ci fossero & Quot; car & Quot; bambini sotto la radice. Per questo motivo, riordinare l'elenco delle auto che tornano dalla query non influisce sull'elenco iniziale.

Ecco una soluzione che aggiunge e riordina:

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)

L'affermazione con le auto correttamente ordinate passa e l'output 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>

Altri suggerimenti

ted, forse non hai notato che volevo "" inserire una nuova auto subito dopo la macchina " HSV Maloo " '' ', quindi modifico il tuo codice in:

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

new XmlNodePrinter().print(carRecords)

ora funziona con l'ordine corretto! grazie all'amplificatore 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>
&

lt; mano onda gt &; questi non sono i codz che cerchi lt &; / mano onda gt &;

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

Non so se esiste un modo più intelligente di creare nuovi nodi ... ma questo funziona per me.

EDIT: uhg ... grazie ragazzi ... sono diventato pigro e stavo stampando i nodi macchina quando ho provato questo invece del root ... yikes.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top