Groovy XML 和 "xml:" 命名空间



我正在编写几个修改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)

中的结果

[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.

xml:namespace默认情况下应该存在,我尝试使用.declareNamespace()添加它,但似乎没有帮助。我觉得我错过了一些显而易见的东西,但谷歌一直无法告诉我它是什么。

几年前发现了这个线程,上面写着:

问题是原始文档使用了默认的名称空间。

SMB通常不使用默认名称空间,因此它会创建一个标记,并使用它来显式标记名称空间中的每个元素。就XML解析器而言,如何指示名称空间并不重要。然而,有时使用默认名称空间是有表面原因的。

如果您将mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee")作为构建器闭包中的第一行,您应该会得到所需的输出。

然而,这似乎不起作用

我找到的唯一解决方案是让Slurper忽略名称空间和验证;

def root = new XmlSlurper(false,false).parseText(source)

将默认命名空间设置为空标记对我有效(没有添加"tag0")。我使用默认的XmlSlurper构造函数来进行命名和验证,例如:

def root = new XmlSlurper().parseText(source).declareNamespace(xml: "http://www.w3.org/XML/1998/namespace")

绑定时,声明空命名空间:

def writer = new StreamingMarkupBuilder().bind {
    mkp.declareNamespace("": "") //get rid of "tag0"
    mkp.declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 
    mkp.yield root
}

最新更新