Groovys XmlSlurper 中的命名空间处理

发布于 2024-12-23 06:11:08 字数 520 浏览 2 评论 0原文

情况:

def str = """
  <foo xmlns:weird="http://localhost/">
    <bar>sudo </bar>
    <weird:bar>make me a sandwich!</weird:bar>
  </foo>
"""
def xml = new XmlSlurper().parseText(str)
println xml.bar

这个片段的输出是

# sudo make me a sandwich!

解析器似乎合并了 的内容。

是否需要这种行为?如果是,如何避免这种行为并仅选择

The situation:

def str = """
  <foo xmlns:weird="http://localhost/">
    <bar>sudo </bar>
    <weird:bar>make me a sandwich!</weird:bar>
  </foo>
"""
def xml = new XmlSlurper().parseText(str)
println xml.bar

The output of this snippet is

# sudo make me a sandwich!

It seems like the parser merges the contents of <bar> and <weird:bar>.

Is this behavior desired and if yes, how can I avoid this and select only <bar> or <weird:bar>?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

愁杀 2024-12-30 06:11:08

默认情况下,XMLSlurper 不支持命名空间。可以通过使用 declareNamespace 声明命名空间来打开此功能 方法

def str = """ 
<foo xmlns:weird="http://localhost/">
  <bar>sudo </bar>
  <weird:bar>make me a sandwich!</weird:bar>
</foo>
""" 
def xml = new XmlSlurper().parseText(str).declareNamespace('weird':'http://localhost/')
println xml.bar // without namespace awareness, will print "sudo make me a sandwich!"
println xml.':bar' // will only print "sudo"
println xml.'weird:bar' // will only print "make me a sandwich!"

输出是:

sudo make me a sandwich!
sudo
make me a sandwich!

第一个 println 仍然不支持命名空间。第二个 println 将只打印没有命名空间的标签。如果您使用第三个 println 中显示的前缀来限定元素,您只会获得命名空间标记。

By default XMLSlurper is not namespace aware. This can be turned on by declaring namespaces with the declareNamespace Method.

def str = """ 
<foo xmlns:weird="http://localhost/">
  <bar>sudo </bar>
  <weird:bar>make me a sandwich!</weird:bar>
</foo>
""" 
def xml = new XmlSlurper().parseText(str).declareNamespace('weird':'http://localhost/')
println xml.bar // without namespace awareness, will print "sudo make me a sandwich!"
println xml.':bar' // will only print "sudo"
println xml.'weird:bar' // will only print "make me a sandwich!"

The output is:

sudo make me a sandwich!
sudo
make me a sandwich!

The first println will still not be namespace aware. The second println will only print the tag without namespace. If you qualify element with the prefix shown in the third println you only get the namespaced tag.

智商已欠费 2024-12-30 06:11:08

我知道这个问题不久前就得到了回答,但对于其他面临同样问题的人来说,这是一个替代方案。 XmlSlurper 类具有三个构造函数,其中几个允许您指定您希望它能够感知名称空间。

public XmlSlurper(boolean validating, boolean namespaceAware)

通过调用 new XmlSlurper(false, true) 来声明 slurper。
我希望这对其他人有用。

I know this was answered a while ago, but here's an alternative for anyone else facing the same issue. The XmlSlurper class has three constructors, a couple of which allow you to specify you want it to be namespace-aware.

public XmlSlurper(boolean validating, boolean namespaceAware)

Declare the slurper by calling new XmlSlurper(false, true).
I hope this is useful to others.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文