Xml 如何打印保留名称空间的groovy节点?
当我使用此代码输出一些XML时,我使用Xml 如何打印保留名称空间的groovy节点?,xml,groovy,namespaces,xml-parsing,Xml,Groovy,Namespaces,Xml Parsing,当我使用此代码输出一些XML时,我使用XmlParser XmlParser parser = new XmlParser() def root = parser.parseText(feedUrl.toURL().text) def writer = new StringWriter() new XmlNodePrinter(new PrintWriter(writer)).print(root) println writer.toString() 根节点上的命名空间声明不会打印,即使它们位
XmlParser
XmlParser parser = new XmlParser()
def root = parser.parseText(feedUrl.toURL().text)
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
println writer.toString()
根节点上的命名空间声明不会打印,即使它们位于根节点的
toString()
中。。。有什么想法吗?看起来它正在对输出进行非规范化,包括名称空间上下文以及实际需要名称空间上下文的节点
例如,此问题的网页中嵌入了creativeCommons命名空间:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:thr="http://purl.org/syndication/thread/1.0">
<!-- snip -->
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<!-- snip -->
</feed>
它最终将名称空间移动到需要该名称空间的许可证节点。在这种情况下没有什么大不了的,因为该名称空间中只有一个节点。如果大部分XML都是名称空间的,那么它可能会让事情变得更加臃肿
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- snip -->
<creativeCommons:license xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
http://www.creativecommons.org/licenses/by-nc/2.5/rdf
</creativeCommons:license>
<!-- snip -->
</feed>
http://www.creativecommons.org/licenses/by-nc/2.5/rdf
如果您确实想要规范化节点,则必须对XmlNodePrinter进行一些调整,以便在XML中执行2次传递,首先收集所有使用的名称空间,然后在顶部而不是在每个名称空间节点中输出它们。groovy源代码实际上可读性很好,如果您真的需要它,修改也不会那么困难。我也遇到了同样的问题,经过一番修改,我找到了一个解决方法 您使用XmlSluper而不是XmlParser,并使用StreamingMarkupBuilder而不是XmlNodePrinter。然后利用bind中的闭包,并使用mkp内置变量来声明名称空间 比如,;使用上面Ted的源xml示例:
def root = new XmlSlurper().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text))
def outputBuilder = new StreamingMarkupBuilder()
String result = XmlUtil.serialize(outputBuilder.bind {
mkp.declareNamespace('':'http://www.w3.org/2005/Atom')
mkp.declareNamespace('creativeCommons':'http://backend.userland.com/creativeCommonsRssModule')
mkp.declareNamespace('re':'http://purl.org/atompub/rank/1.0')
mkp.yield root }
)
println result
结果:
<?xml version="1.0" encoding="UTF-8"?><feed xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns="http://www.w3.org/2005/Atom" xmlns:re="http://purl.org/atompub/rank/1.0">
<title type="text">How do I print a groovy Node with namespace preserved? - Stack Overflow </title>
<link rel="self" type="application/atom+xml" href="http://stackoverflow.com/feeds/question/227447"/>
<link rel="alternate" type="text/html" href="http://stackoverflow.com/questions/227447"/>
<subtitle>most recent 30 from stackoverflow.com</subtitle>
<updated>2011-02-16T05:13:17Z</updated>
<id>http://stackoverflow.com/feeds/question/227447</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<entry>
<id>http://stackoverflow.com/questions/227447/how-do-i-print-a-groovy-node-with-namespace-preserved</id>
<re:rank scheme="http://stackoverflow.com">2</re:rank>
如何打印保留名称空间的groovy节点堆栈溢出
stackoverflow.com最近发布的30条
2011-02-16T05:13:17Z
http://stackoverflow.com/feeds/question/227447
http://www.creativecommons.org/licenses/by-nc/2.5/rdf
http://stackoverflow.com/questions/227447/how-do-i-print-a-groovy-node-with-namespace-preserved
2.
谢谢你,handy
<?xml version="1.0" encoding="UTF-8"?><feed xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns="http://www.w3.org/2005/Atom" xmlns:re="http://purl.org/atompub/rank/1.0">
<title type="text">How do I print a groovy Node with namespace preserved? - Stack Overflow </title>
<link rel="self" type="application/atom+xml" href="http://stackoverflow.com/feeds/question/227447"/>
<link rel="alternate" type="text/html" href="http://stackoverflow.com/questions/227447"/>
<subtitle>most recent 30 from stackoverflow.com</subtitle>
<updated>2011-02-16T05:13:17Z</updated>
<id>http://stackoverflow.com/feeds/question/227447</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<entry>
<id>http://stackoverflow.com/questions/227447/how-do-i-print-a-groovy-node-with-namespace-preserved</id>
<re:rank scheme="http://stackoverflow.com">2</re:rank>