使用Groovy对XML文件进行排序 [英] Use Groovy to Sort XML File

查看:68
本文介绍了使用Groovy对XML文件进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以使用Groovy对某些属性进行xml文件排序?

Is there a way I can sort an xml file base on certain attributes with Groovy?

这是我的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,但是我似乎还不太清楚如何做到这一点.

I've looked into XMLSlurper but I can't quite seem to figure out how to do this.

推荐答案

这是对@dmahapatro答案的修改,保留了嵌套的节点结构.

Here's a modification to @dmahapatro's answer that preserves the nested node structure.

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文档打印到标准输出中.
  • Using XmlParser instead of XmlSlurper generates nodes that can be printed using XmlNodePrinter.
  • The children of the node are sorted by name using sort {it.attribute('name')}
  • The true attribute to sort mutates the underlying list, which reorders the child nodes.
  • The XmlNodePrinter prints the re-sorted xml document to standard out.

这篇关于使用Groovy对XML文件进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆