Как вставлять / перемещать / удалять узлы в xml с помощью Groovy?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

например, у меня есть следующий 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>
'''

и я хочу переместить автомобиль "Royale" на первый и вставить новый автомобиль сразу после автомобиля "HSV Maloo", результатом будет:

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

Как это сделать с помощью Groovy?комментарии приветствуются.

Это было полезно?

Решение

Я пошел по тому же пути, что и danb, но столкнулся с проблемами при распечатке полученного XML. Затем я понял, что NodeList, который был возвращен, запрашивая у корня все его & Quot; car & Quot; список детей не совпадает с тем, что вы получаете, просто спрашивая детей root. Несмотря на то, что в этом случае они оказались одинаковыми списками, их не всегда было бы, если бы не было & Quot; car & Quot; дети под корнем. Из-за этого изменение списка автомобилей, которые возвращаются из запроса, не влияет на первоначальный список.

Вот решение, которое добавляет и переупорядочивает:

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)

Утверждение с правильно упорядоченными машинами проходит, и 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>

Другие советы

Тед, может быть, вы не заметили, что я хотел '' 'вставить новую машину сразу после машины " HSV Maloo "' '', поэтому я изменил ваш код следующим образом:

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

new XmlNodePrinter().print(carRecords)

Теперь все работает в правильном порядке! спасибо Danb & amp; Тэд.

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

<hand-wave> это не те кодзы, которых вы ищете </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']))

Я не знаю, есть ли более разумный способ создавать новые узлы...но у меня это работает.

Редактировать:угу...спасибо, ребята...Я обленился и печатал carNodes, когда тестировал это вместо root...фу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top