12

情况:

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!

似乎解析器合并了<bar>and的内容<weird:bar>

是否需要这种行为,如果是,我该如何避免这种情况并仅选择<bar>or <weird:bar>

4

2 回答 2

20

默认情况下,XMLSlurper 不支持命名空间。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!"

输出是:

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

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

于 2011-12-29T16:13:58.723 回答
4

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

public XmlSlurper(boolean validating, boolean namespaceAware)

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

于 2017-10-24T17:32:37.210 回答