Groovy로 XML에서 노드를 삽입/이동/삭제하는 방법은 무엇입니까?
문제
예를 들어 다음 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>
'''
그루비로 어떻게 하는가? 의견을 환영합니다.
해결책
나는 Danb와 비슷한 경로를 내려 갔지만 실제로 결과 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>
'''
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)
Propertly 주문 차량 통과 및 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>
다른 팁
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>
u003Chand-wave>이것들은 당신이 찾는 codz가 아닙니다u003C/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']))
새 노드를 만들 수있는 더 똑똑한 방법이 있는지 모르겠지만 ... 나에게 적합합니다.
편집 : uhg ... 고마워 ... 나는 게으르고 뿌리 대신 이것을 테스트했을 때 게으르고 카르노 드를 인쇄하고 있었다.