3

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>

出力を

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

私は XMLSlurper を調べましたが、これを行う方法がよくわかりません。

4

2 に答える 2

7

これは、ネストされたノード構造を保持する @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)

何が起こっているかは次のとおりです。

  • XmlParser代わりに を使用すると、 を使用XmlSlurperして印刷できるノードが生成されXmlNodePrinterます。
  • ノードの子は、次を使用して名前でソートされますsort {it.attribute('name')}
  • trueソートする属性は、下位のリストを変更し、子ノードを並べ替えます。
  • XmlNodePrinter、再ソートされた xml ドキュメントを標準出力に出力します。
于 2013-08-09T19:46:04.953 に答える
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{
    rootNode.Person.@name.list()*.toString().sort().each{
        Person(name: it)
    }
}

println writer
于 2013-08-09T16:25:49.100 に答える