gpt4 book ai didi

xml - groovy - xml - 保留属性顺序

转载 作者:数据小太阳 更新时间:2023-10-29 02:36:54 28 4
gpt4 key购买 nike

我需要打印我使用 groovy 操作的 XML 并维护属性顺序。我不关心它是使用 XmlParser/XmlNodePrinter 还是 XmlSlurper/StreamingMarkupBuilder。我目前的代码如下:

File file = new File('input.xml')
def root = new XmlSlurper().parse(file)

def admins = root.user.findAll {it.@role.text().equals("admin")}
admins.each { admin ->
admin.permission.findAll { it.@interface.text().equals("RoleManagement")
}.each {
it.@implementation = "AdminRoleManagement"
}
}

def smb = new StreamingMarkupBuilder().bind { mkp.yield root }
new File('output.xml').text = groovy.xml.XmlUtil.serialize(smb)

这是输入程序的 XML

<users>
<user username="test1234" role="admin">
<permission interface="com.test.RoleManagement" implementation="com.test.AdminRoleManagement"/>
<permission interface="com.test.UserAdministration" implementation="com.test.UserAdministrationImpl"/>
</user>
</users>

但是,在我打印出修改后的文件之后,接口(interface)和实现属性被颠倒了。

我已经知道您在想什么:xml 属性顺序无关紧要。好吧,我老板的要求是保留属性顺序 b/c 多年来一直如此。我实际上应该使用 Java/DOM4J 编写这个解析器,并且我试图向我的团队展示一些新东西。任何帮助,将不胜感激。谢谢!

最佳答案

如果不编写自己的代码来输出 XML,我认为这是不可能的。

SAX 解析器没有属性排序 (AFAIK) 的概念,因此在 XmlSlurper 甚至看到数据之前顺序就会丢失...我找到了一个 thread on the groovy-user list对此进行了讨论,但似乎没有提出任何解决方案......

认为 XmlParser 是可行的,因为它似乎可以维持秩序:

def xml = '''<users>
| <user username="test1234" role="admin">
| <permission interface="com.test.RoleManagement" implementation="com.test.AdminRoleManagement"/>
| <permission interface="com.test.UserAdministration" implementation="com.test.UserAdministrationImpl"/>
| </user>
|</users>'''.stripMargin()

def root = new XmlParser().parseText( xml )

def admins = root.user.findAll { it.@role == "admin" }

admins.each { admin ->
admin.permission.findAll {
it.@interface == "com.test.RoleManagement"
}.each {
it.@implementation = "AdminRoleManagement"
}
}

String output = new StringWriter().with { sw ->
new XmlNodePrinter( new PrintWriter( sw ) ).print( root )
sw.toString()
}
println output

打印:

<users>
<user username="test1234" role="admin">
<permission interface="com.test.RoleManagement" implementation="AdminRoleManagement"/>
<permission interface="com.test.UserAdministration" implementation="com.test.UserAdministrationImpl"/>
</user>
</users>

乍一看哪个是对的?

关于xml - groovy - xml - 保留属性顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9978712/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com