la gestione dello spazio dei nomi in Groovys XmlSlurper

voti
38

La situazione:

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

L'uscita di questo frammento è

# sudo make me a sandwich!

Sembra che il parser fonde il contenuto di <bar>e <weird:bar>.

E 'questo comportamento desiderato e se sì, come posso evitare questo e selezionare solo <bar>o <weird:bar>?

È pubblicato 29/12/2011 alle 13:31
dall'utente
In altre lingue...                            


2 risposte

voti
17

Di XMLSlurper default non è a conoscenza namespace. Questo può essere attivata dichiarando spazi dei nomi con il declareNamespace metodo .

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

L'uscita è:

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

Il primo printlnnon sarà ancora spazio dei nomi a conoscenza. La seconda printlnstamperà solo il tag senza namespace. Se si qualificano elemento con il prefisso indicato nella terza printlnsi ottiene solo il tag namespace.

Risposto il 29/12/2011 a 14:13
fonte dall'utente

voti
2

So che questo è stato risposto qualche tempo fa, ma ecco un'alternativa per chiunque altro di fronte lo stesso problema. La XmlSlurperclasse ha tre costruttori, un paio dei quali consentono di specificare che si desidera che sia namespace-aware.

public XmlSlurper(boolean validating, boolean namespaceAware)

Dichiarare la slurper chiamando new XmlSlurper(false, true). Spero che questo sia utile per gli altri.

Risposto il 24/10/2017 a 16:32
fonte dall'utente

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