2013-08-09 3 views
2

Groovy로 특정 속성에서 XML 파일 기반을 정렬 할 수있는 방법이 있습니까?Groovy를 사용하여 XML 파일 정렬

은 여기 내 XML

<List> 
    <Person name="fff"/> 
    <Person name="ggg"> 
     <PhoneNum> 
      <AreaCode>555</AreaCode> 
      <Number>1234567</Number> 
     </PhoneNum> 
    </Person> 
    <Person name="eee"/> 
    <Person name="ccc"/> 
    <Person name="jjj"/> 
    <Person name="ddd"> 
     <PhoneNum> 
      <AreaCode>555</AreaCode> 
      <Number>7654321</Number> 
     </PhoneNum> 
    </Person> 
    <Person name="aaa"/> 
    <Person name="bbb"/> 
    <Person name="ttt"/> 
</List> 

있고 난 출력 내가 XMLSlurper으로 검토 한하지만 난 꽤이 작업을 수행하는 방법을 알아낼 수 없습니다

<List> 
    <Person name="aaa"/> 
    <Person name="bbb"/> 
    <Person name="ccc"/> 
    <Person name="ddd"> 
     <PhoneNum> 
      <AreaCode>555</AreaCode> 
      <Number>7654321</Number> 
     </PhoneNum> 
    </Person> 
    <Person name="eee"/> 
    <Person name="fff"/> 
    <Person name="ggg"> 
     <PhoneNum> 
      <AreaCode>555</AreaCode> 
      <Number>1234567</Number> 
     </PhoneNum> 
    </Person> 
    <Person name="jjj"/> 
    <Person name="ttt"/> 
</List> 

되고 싶어요.

답변

3

여기에 중첩 된 노드 구조를 보존 @ dmahapatro의 대답에 대한 수정이다.

import groovy.xml.MarkupBuilder 

String xml = ''' 
<List> 
    <Person name="fff"/> 
    <Person name="ggg"> 
     <PhoneNum> 
      <AreaCode>555</AreaCode> 
      <Number>1234567</Number> 
     </PhoneNum> 
    </Person> 
    <Person name="eee"/> 
    <Person name="ccc"/> 
    <Person name="jjj"/> 
    <Person name="ddd"> 
     <PhoneNum> 
      <AreaCode>555</AreaCode> 
      <Number>7654321</Number> 
     </PhoneNum> 
    </Person> 
    <Person name="aaa"/> 
    <Person name="bbb"/> 
    <Person name="ttt"/> 
</List> 
''' 

def rootNode = new XmlParser().parseText(xml) 
rootNode.children().sort(true) {it.attribute('name')} 
new XmlNodePrinter().print(rootNode) 

여기에 무슨 일이 일어나고 있는지의 :

  • 대신 XmlSlurperXmlParserXmlNodePrinter를 사용하여 인쇄 할 수있는 노드를 생성 사용. 노드의
  • 아이들은 변이에게 자식 노드를 재정렬 기본 목록을 정렬 할 sort {it.attribute('name')}
  • true 속성을 사용하여 이름으로 분류되어 있습니다.
  • XmlNodePrinter은 re-sorted xml 문서를 표준 출력으로 인쇄합니다.
+0

대단히 감사합니다! :) –

1

나는 이보다 더 좋은 방법이있을 것이라고 생각합니다. 그러나 이것은 금요일에 작동해야합니다. :-)

import groovy.xml.MarkupBuilder 

def xml = '''<List> 
    <Person name="fff"/> 
    <Person name="eee"/> 
    <Person name="ccc"/> 
    <Person name="jjj"/> 
    <Person name="aaa"/> 
    <Person name="bbb"/> 
    <Person name="ttt"/> 
</List>''' 

def rootNode = new XmlSlurper().parseText(xml) 

def writer = new StringWriter() 
def mkp = new MarkupBuilder(writer) 
mkp.List{ 
    [email protected]()*.toString().sort().each{ 
     Person(name: it) 
    } 
} 

println writer 
+0

정렬 할 요소의 하위 요소를 유지하면서 작업을 수행 할 수있는 방법이 있습니까? 내 질문에 편집을 추가하여 볼 수 있습니다. –

+0

도움을 주셔서 감사합니다! –

관련 문제