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')}
  • truesort的属性会改变底层列表,从而重新排序子节点。
  • 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 回答