Groovy로 XML에서 노드를 삽입/이동/삭제하는 방법은 무엇입니까?

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

그루비로 어떻게 하는가? 의견을 환영합니다.

도움이 되었습니까?

해결책

나는 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 ... 고마워 ... 나는 게으르고 뿌리 대신 이것을 테스트했을 때 게으르고 카르노 드를 인쇄하고 있었다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top