如何打印保留命名空间的 groovy 节点?
当我使用此代码输出一些用 XmlParser
解析(和修改)的 XML 时,
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()
中。 root 的 code>...有什么想法吗?
When I use this code to output some XML I parsed (and modified) with 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()
the namespace declarations on the root node are not printed, even though they are there in the toString()
of root... any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我刚刚遇到了同样的问题,经过一番摆弄后我找到了解决方法。
您使用XmlSluper而不是XmlParser并使用StreamingMarkupBuilder< /strong> 而不是 XmlNodePrinter。 然后,您利用 bind 中的闭包并使用 mkp 内置变量来声明名称空间。
例如; 使用上面 Ted 的源 xml 示例:
结果为:
I've just had the same problem and after a bit of fiddling I've found a workaround.
You use the XmlSluper instead of the XmlParser and use StreamingMarkupBuilder instead of XmlNodePrinter. Then you take advantage of the closure in bind and use the mkp built-in variable to declare the namespaces.
For example; using the source xml example of Ted's from above:
Results in :
看起来它正在对输出进行非规范化,并包括名称空间上下文以及实际需要名称空间上下文的节点。
例如,此问题的网页嵌入了 CreativeCommons 命名空间:
当您使用此脚本输出 xml 时:
它最终会将命名空间移动到需要该命名空间的许可证节点。 在这种情况下没什么大不了的,因为该命名空间中只有一个节点。 如果大部分 XML 都是命名空间的,那么它可能会使事情变得更加臃肿。
如果您确实希望节点规范化,则必须对 XmlNodePrinter 进行一些调整,以执行两次 XML 传递,首先收集所有使用的命名空间,然后在顶部而不是在每个命名空间节点中输出它们。 Groovy 源代码实际上非常可读,并且如果您确实需要的话,修改起来并不困难。
It looks like it's denormalizing the output and including the namespace context along with the nodes that actually need the namespace context.
For example, the webpage for this question comes in with creativeCommons namespace embedded:
When you output the xml using this script:
It ends up moving the namespace to the license node that needs that namespace. Not a huge deal in this case as there is only a single node in that namespace. If most of the XML were namespaced, it'd probably bloat things quite a bit more.
If you actually wanted the nodes normalized, you'd have to make some tweaks to the XmlNodePrinter to do 2 passes through the XML, first to gather all of the used namespaces and 2nd to output them at the top rather than within each namespaced node. The groovy source code is actually pretty readable and wouldn't be that hard to modify if you actually needed this.