Manipulace názvů v Groovys XmlSlurper

hlasů
38

Situace:

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

Výstupem tohoto úryvku je

# sudo make me a sandwich!

Vypadá to, že analyzátor sloučí obsah <bar>a <weird:bar>.

Je-li toto chování žádoucí, a pokud ano, jak to mohu vyhnout tomuto a vybrat pouze <bar>, nebo <weird:bar>?

Položena 29/12/2011 v 13:31
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
17

Ve výchozím nastavení XMLSlurper není oboru názvů vědomi. To může být zapnuto vyhlášením jmenné prostory s declareNamespace metodou .

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!"

Výstupem je:

sudo make me a sandwich!
sudo
make me a sandwich!

První printlnstále nebude namespace vědomi. Druhý printlnbude tisknout pouze značku bez názvů. Máte-li nárok prvek s předponou uvedenou v třetině printlnsi jen získat namespaced značku.

Odpovězeno 29/12/2011 v 14:13
zdroj uživatelem

hlasů
2

Vím, že to byla zodpovězena před chvílí, ale tady je alternativou pro kohokoli jiného čelí stejnému problému. XmlSlurperTřída má tři konstruktérů, několik z nich vám umožní určit, chcete, aby to bylo namespace vědomi.

public XmlSlurper(boolean validating, boolean namespaceAware)

Prohlásit slurper voláním new XmlSlurper(false, true). Doufám, že to je užitečné pro ostatní.

Odpovězeno 24/10/2017 v 16:32
zdroj uživatelem

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