Comment insérer / déplacer / supprimer des nœuds au format XML avec Groovy?

StackOverflow https://stackoverflow.com/questions/224926

  •  03-07-2019
  •  | 
  •  

Question

Par exemple, j'ai le document XML suivant:

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

et je veux déplacer la voiture & "Royale &"; jusqu’à la première, puis insérez une nouvelle voiture juste après la voiture & "HSV Maloo &"; le résultat serait:

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

Comment faire avec Groovy? les commentaires sont les bienvenus.

Était-ce utile?

La solution

Je suis passé par un chemin similaire vers danb, mais j'ai rencontré des problèmes lors de l'impression du code XML résultant. Ensuite, j'ai réalisé que la liste de noeuds qui avait été renvoyée en demandant à la racine la totalité de & "Voiture &"; les enfants ne sont pas la même liste que vous obtenez en demandant simplement les enfants de la racine. Même s’ils se trouvent être les mêmes listes dans ce cas, ils ne le seraient pas toujours s’il n’y avait pas de & "Voiture &"; enfants sous la racine. De ce fait, réorganiser la liste des voitures renvoyées par la requête n'affecte pas la liste initiale.

Voici une solution qui ajoute et réorganise:

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'assertion avec les voitures correctement ordonnées passe et les sorties 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>

Autres conseils

Ted, vous n’avez peut-être pas remarqué que je voulais "" insérer une nouvelle voiture juste après la voiture & "HSV Maloo &"; ""; je modifie donc votre code en:

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

new XmlNodePrinter().print(carRecords)

maintenant, ça marche dans le bon ordre! merci à 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>

< onde manuelle > ce ne sont pas les codz que vous recherchez < / 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']))

Je ne sais pas s'il existe un moyen plus intelligent de créer de nouveaux nœuds ... mais cela fonctionne pour moi.

EDIT: euh ... merci les gars ... Je suis devenu paresseux et imprimais carNodes quand j'ai testé cela à la place de la racine ... beurk.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top