- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要打印我使用 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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!