Как вставить / переместить / удалить узлы в XML с Groovy? - PullRequest
12 голосов
/ 22 октября 2008

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

Ответы [ 3 ]

13 голосов
/ 23 октября 2008

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

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

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>
5 голосов
/ 23 октября 2008

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

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

new XmlNodePrinter().print(carRecords)

Теперь все работает правильно! благодаря Данб и Тед.

<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>
2 голосов
/ 23 октября 2008

<рука-волна> это не тот кодч, которого вы ищете </ Рука волны>

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

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

РЕДАКТИРОВАТЬ: хм ... спасибо, ребята ... Я ленился и печатал carNode, когда я проверял это вместо рута ... yikes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...