2011-12-29 16 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 में दिखाया गया है के साथ तत्व चुने जाते हैं तो आप केवल namespaced टैग मिलता है।

+1

धन्यवाद, कि कुछ चीजें :) मैं अलग xmls को पार्स कर रहा हूँ और मैं नहीं जानता कि जो नामस्थान वे उपयोग कर रहे बताते हैं; क्या 'println xml' के आउटपुट को प्राप्त करने की कोई संभावना है: बार 'नामस्थानों के लिए रूट तत्व को पार्स करने और उन्हें घोषित करने के अलावा? – codeporn

+0

मुझे लगता है कि XmlSlurper नाम स्थान डिफ़ॉल्ट रूप से अवगत है, 'नई XmlSlurper() के बाद से -> नई XmlSlurper (गलत, सच)': http://stackoverflow.com/questions/33418826/are-xmlparser-and-xmlslurper-namespace- जागरूक-द्वारा-डिफ़ॉल्ट – jalopaba

+0

उह। किसी कारण से, यह मेरे लिए काम नहीं कर रहा है। मैं एक आरएसएस दस्तावेज़ को पार्स कर रहा हूं जिसमें हेडर में घोषित नामस्थान हैं। link'.text() और rss.channel.'atom:: मैं rss.channel.link लेकिन rss.channel.'atom पहुँच सकते हैं। लिंक '@ href.text() सभी रिक्त मान। लेकिन अरे, मैं क्यों जब शीर्षक में xmlns तत्व में है यह करने के लिए होना चाहिए :( – Umopepisdn

2

मैं इस समय पहले उत्तर दिया गया है, लेकिन यहां किसी और को एक ही मुद्दा का सामना करना पड़ के लिए एक वैकल्पिक है। XmlSlurper वर्ग तीन कंस्ट्रक्टर्स, a couple of which आप आप इसे नाम स्थान-अवगत होना चाहते हैं निर्दिष्ट कर सकते हैं है।

public XmlSlurper(boolean validating, boolean namespaceAware) 

new XmlSlurper(false, true) फोन करके slurper घोषित। मुझे आशा है कि यह दूसरों के लिए उपयोगी होगा।

संबंधित मुद्दे