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>です<weird:bar>

この動作は望ましいですか。そうであれば、どうすればこれを回避して、またはのみを選択できます<bar><weird:bar>

4

2 に答える 2

20

デフォルトでは、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はまだ名前空間を認識しません。2つ目printlnは、名前空間なしでタグのみを出力します。3番目に示されているプレフィックスで要素を修飾するとprintln、名前付きタグのみが取得されます。

于 2011-12-29T16:13:58.723 に答える
4

私はこれが少し前に答えられたことを知っています、しかしここに同じ問題に直面している他の誰かのための代替案があります。このXmlSlurperクラスには3つのコンストラクターがあり、そのうちの2つを使用して、名前空間を認識するように指定できます。

public XmlSlurper(boolean validating, boolean namespaceAware)

を呼び出して、スラーパーを宣言しますnew XmlSlurper(false, true)。これが他の人にも役立つことを願っています。

于 2017-10-24T17:32:37.210 に答える