2011-12-29 66 views
10

辦理情況:命名空間中Groovys的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>

回答

17

默認情況下XMLSlurper不支持名稱空間。這可以通過使用declareNamespaceMethod聲明命名空間來打開。

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

謝謝,這解釋了幾件事情:)我解析不同的xml,我不知道他們正在使用哪些命名空間;除了解析命名空間的根元素並聲明它們之外,是否有可能實現'println xml。':bar''的輸出? – codeporn 2011-12-29 17:04:50

+0

我認爲默認情況下XmlSlurper是名稱空間感知的,因爲'new XmlSlurper() - > new XmlSlurper(false,true)':http://stackoverflow.com/questions/33418826/are-xmlparser-and-xmlslurper-namespace-意識到默認 – jalopaba 2015-11-03 09:59:19

+0

呃。出於某種原因,這不適合我。我正在解析頭文件中聲明名稱空間的RSS文檔。我可以訪問rss.channel.link,但rss.channel.'atom:link'.text()和rss.channel.'atom:link'。@ href.text()全部返回空白值。 :( – Umopepisdn 2016-05-15 20:55:32

2

我知道這是前段時間回答的,但對於面臨同樣問題的其他人來說,這是一種替代方案。 XmlSlurper類有三個構造函數,a couple of which允許您指定您希望它是名稱空間感知。

public XmlSlurper(boolean validating, boolean namespaceAware) 

通過調用new XmlSlurper(false, true)聲明slurper。 我希望這對他人有用。