[英]groovy - xml - preserve attribute order
我需要打印我使用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>
但是,在打印出修改后的文件之后,接口和实现属性是相反的。
我已经知道你在想什么:xml属性顺序无关紧要。 好吧,我的老板的要求是保留属性顺序b / c它已经这么久了。 我实际上应该使用Java / DOM4J编写这个解析器,我试图向我的团队展示一些新东西。 任何帮助,将不胜感激。 谢谢!
如果不编写自己的代码来输出XML,我认为这是不可能的。
SAX解析器没有属性排序的概念(AFAIK),因此在XmlSlurper
甚至看到数据之前,顺序将丢失......我在groovy-user列表上找到了一个讨论这个问题的线程 ,但它没有似乎想出任何解决方案......
我认为使用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>
乍一看似乎对吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.