Как вставлять / перемещать / удалять узлы в xml с помощью Groovy?
например, у меня есть следующий XML-документ:
def CAR_RECORDS = '''
'''
и 9X_xml я хочу переместить машину "Royale" на первую 9X_xml и вставить новую машину сразу после машины 9X_xml-file "HSV Maloo", результат будет:
'''
'''
Как это сделать 9X_groovy с помощью Groovy? комментарии приветствуются.
Ответ #1
Ответ на вопрос: Как вставлять / перемещать / удалять узлы в xml с помощью Groovy?
Я пошел по тому же пути, что и danb, но 9X_xml столкнулся с проблемами при печати полученного 9X_xml-file XML. Затем я понял, что NodeList, который 9X_xml был возвращен при запросе корня для всех 9X_groovy его дочерних «автомобилей», не совпадает 9X_xml со списком, который вы получаете, просто 9X_groovy запрашивая потомков корня. Несмотря на то, что 9X_groovy в данном случае это одни и те же списки, они 9X_groovy не всегда были бы такими, если бы под корнем 9X_xml не было дочерних «автомобилей». Из-за этого 9X_xml-file изменение списка автомобилей, которые вернулись 9X_xml из запроса, не влияет на исходный список.
Вот 9X_groovy решение, которое добавляет и меняет порядок:
def CAR_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)
Утверждение 9X_xml-file с правильно упорядоченными автомобилями 9X_groovy проходит, и XmlNodePrinter выводит:
Ответ #2
Ответ на вопрос: Как вставлять / перемещать / удалять узлы в xml с помощью Groovy?
Тед, возможно, вы не заметили, что я хотел 9X_xml-file '' 'вставить новую машину сразу после машины 9X_groovy "HSV Maloo"' '', поэтому я изменил ваш код 9X_groovy на:
def newCar = new Node(null, 'car', [name:'My New Car', make:'Peel', year:'1962'])
cars.add(2, newCar)
new XmlNodePrinter().print(carRecords)
теперь он работает в правильном порядке! спасибо 9X_xml-file danb & ted.
Ответ #3
Ответ на вопрос: Как вставлять / перемещать / удалять узлы в xml с помощью Groovy?
<взмах рукой> это не та треска, которую вы ищете взмах рукой>
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']))
Я 9X_groovy не знаю, есть ли более разумный способ создавать 9X_xml-file новые узлы... но это работает для меня.
РЕДАКТИРОВАТЬ: эээ... спасибо, ребята... Я 9X_groovy поленился и печатал carNodes, когда тестировал 9X_xml это вместо рута... ой.
-
2
-
4
-
3
-
3
-
2
-
2
-
1
-
1
-
3
-
1
-
3
-
7
-
7
-
6
-
6
-
5
-
9
-
5
-
12
-
1
-
6
-
3
-
4
-
2
-
5
-
2
-
3
-
5
-
5
-
4
-
2
-
3
-
2
-
7
-
8
-
10
-
6
-
1
-
4
-
2
-
3
-
3
-
3
-
3
-
2
-
5
-
4
-
2
-
2
-
2