Groovys XmlSlurper में नाम स्थान से निपटने

वोट
38

स्थिति:

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>?

29/12/2011 को 13:31
उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
17

डिफ़ॉल्ट 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इच्छा अभी भी नाम स्थान के बारे में पता नहीं हो। दूसरे printlnही नाम स्थान के बिना टैग प्रिंट होगा। आप उपसर्ग तीसरे में दिखाया गया है के साथ तत्व चुने जाते हैं printlnतो आप केवल namespaced टैग मिलता है।

29/12/2011 को 14:13
का स्रोत उपयोगकर्ता

वोट
2

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

public XmlSlurper(boolean validating, boolean namespaceAware)

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

24/10/2017 को 16:32
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more