Eri*_*man 7 groovy xml-serialization xml-parsing
我正在编写修改xml文件的几个脚本.有问题的文件使用xml:lang元素.Groovy(XmlSlurper)似乎正在插入一个tag0命名空间,我不介意过,但它似乎打破了以后使用XmlUtil处理.
一个例子:
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
String source = """<?xml version='1.0' encoding='UTF-8'?>
<root>
<one xml:lang="en">First</one>
<one xml:lang="de">Second</one>
</root>
"""
def root = new XmlSlurper().parseText(source).declareNamespace(xml: "http://www.w3.org/XML/1998/namespace")
println root
String xml = new StreamingMarkupBuilder().bind{
mkp.xmlDeclaration()
out << root
}
println xml
println XmlUtil.serialize(xml)
Run Code Online (Sandbox Code Playgroud)
结果是
[Fatal Error] :2:44: The value of the attribute "prefix="xmlns",localpart="tag0",rawname="xmlns:tag0"" is invalid. Prefixed namespace bindings may not be empty.
Run Code Online (Sandbox Code Playgroud)
默认情况下,xml:namespace应该存在,我尝试使用.declareNamespace()添加它,但它似乎没有帮助.我觉得我错过了一些明显的东西,但Google无法告诉我它是什么.
从几年前发现这个帖子,其中说:
问题是原始文档使用默认命名空间.
SMB通常不使用默认命名空间,因此它会发明一个标记并使用它来显式标记命名空间中的每个元素.就XML解析器而言,如何指示命名空间并不重要.但是,为什么有时需要使用默认命名空间,这是美化的原因.
如果将
mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee")
第一行放在构建器闭包中,则应获得所需的输出.
但是,这似乎不起作用
我找到的唯一解决方案是让Slurper忽略命名空间和验证;
def root = new XmlSlurper(false,false).parseText(source)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5277 次 |
最近记录: |