Pergunta

Por exemplo, eu tenho o seguinte 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 eu quero mover o carro "Royale" até primeiro, e inserir um novo carro logo após o carro "HSV Maloo", o resultado seria:

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

Como fazê-lo com Groovy? Comentários são bem-vindos.

Foi útil?

Solução

Eu fui para baixo uma rota semelhante a DANB, mas teve problemas quando, na verdade, imprimindo o XML resultante. Então eu percebi que o NodeList que foi devolvido por pedir a raiz para tudo isso de crianças "carro" não é a mesma lista que você começa por apenas pedindo para as crianças da raiz. Mesmo que eles acontecem ser as mesmas listas, neste caso, não seria sempre se houvesse não crianças "carro" na raiz. Devido a isso, reording a lista de carros que voltam a partir da consulta não afeta a lista inicial.

Aqui está uma solução que acrescenta e 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)

A afirmação com os passes carros propertly encomendados, e as saídas 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>

Outras dicas

ted, talvez você não percebeu que eu queria '' 'insert um novo carro logo após carro 'HSV Maloo'' '', então eu modificar seu código para:

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

new XmlNodePrinter().print(carRecords)

Agora, ele trabalha com ordem correta! graças 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>

estes não são o codz você procura

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

Eu não sei se existe uma maneira mais inteligente para criar novos nós ... mas que funciona para mim.

EDIT: uhg ... Obrigado rapazes ... Eu tenho preguiça e estava imprimindo carNodes quando eu testei isso em vez de raiz ... yikes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top