【问题标题】:Namespace handling in Groovys XmlSlurperGroovys XmlSlurper 中的命名空间处理
【发布时间】:2011-12-29 15:31:39
【问题描述】:

情况:

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

这个sn-p的输出是

# sudo make me a sandwich!

解析器似乎合并了&lt;bar&gt;&lt;weird:bar&gt;的内容。

是否需要这种行为,如果需要,我该如何避免这种情况并只选择&lt;bar&gt;&lt;weird:bar&gt;

【问题讨论】:

    标签: xml parsing grails groovy xmlslurper


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这解释了一些事情 :) 我正在解析不同的 xml,但我不知道它们使用的是哪些命名空间;除了解析命名空间的根元素并声明它们之外,是否有可能实现println xml.':bar' 的输出?
    • 我认为 XmlSlurper 默认支持命名空间,因为 new XmlSlurper() -&gt; new XmlSlurper(false, true): stackoverflow.com/questions/33418826/…
    • 呃。出于某种原因,这对我不起作用。我正在解析一个带有在标题中声明的名称空间的 RSS 文档。我可以访问 rss.channel.link 但 rss.channel.'atom:link'.text() 和 rss.channel.'atom:link'.@href.text() 都返回空白值。 :(
    • 我用 .declareNamespace('atom':'w3.org/2005/Atom') 修复了它。但是,当标头位于响应中的 xmlns 元素中时,为什么我必须这样做?
    【解决方案2】:

    我知道这已在不久前得到解答,但对于面临相同问题的其他人来说,这里有一个替代方案。 XmlSlurper 类有三个构造函数,a couple of which 允许你指定你希望它是命名空间感知的。

    public XmlSlurper(boolean validating, boolean namespaceAware)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2011-07-07
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多