Как вставлять/перемещать/удалять узлы в xml с помощью Groovy?
например, у меня есть следующий 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? комментарии приветствуются.
Ответы
Ответ 1
Я пошел по аналогичному пути к 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 { [email protected] == '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*[email protected]
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>
Ответ 2
ted, может быть, вы не заметили, что я хотел "вставить новый автомобиль сразу после автомобиля" 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 и 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>
Ответ 3
< ручная волнa > это не то, что вы ищете
</рука волны >
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']))
Я не знаю, есть ли более умный способ создания новых узлов... но это работает для меня.
EDIT: uhg... спасибо, ребята... Я ленился и печатал carNodes, когда я тестировал это вместо корня... yikes.