Groovys XmlSlurper中的命名空间处理

时间:2011-12-29 15:31:39

标签: xml parsing grails groovy xmlslurper

情况:

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><weird:bar>的内容。

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

2 个答案:

答案 0 :(得分:17)

默认情况下,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中显示的前缀限定元素,则只能获得命名空间标记。

答案 1 :(得分:4)

我知道这已经回答了一段时间,但对于遇到同样问题的其他人来说,这是另一种选择。 XmlSlurper类有三个构造函数,a couple of which允许您指定希望它是名称空间感知的。

public XmlSlurper(boolean validating, boolean namespaceAware)

通过调用new XmlSlurper(false, true)来宣告诽谤者。 我希望这对其他人有用。