Namespace handling in Groovys XmlSlurper

stemmen
38

De situatie:

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

De output van dit fragment is

# sudo make me a sandwich!

Het lijkt alsof de parser voegt de inhoud van <bar>en <weird:bar>.

Is dit gedrag gewenst is en zo ja, hoe kan ik dit voorkomen en selecteer alleen <bar>of <weird:bar>?

De vraag is gesteld op 29/12/2011 om 13:31
user
In andere talen...                            


2 antwoorden

stemmen
17

Standaard XMLSlurper wordt niet namespace op de hoogte. Dit kan worden aangezet door te verklaren naamruimten de declareNamespace methode .

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

De uitvoer is:

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

De eerste printlnwil nog steeds niet namespace op de hoogte zijn. De tweede printlnwordt alleen de tag af te drukken zonder namespace. Als je element in aanmerking komt met de in de derde prefix printlnje alleen maar de naamruimten tag.

antwoordde op 29/12/2011 om 14:13
bron van user

stemmen
2

Ik weet dat dit was een tijdje geleden beantwoord, maar hier is een alternatief voor iemand anders geconfronteerd met hetzelfde probleem. De XmlSlurperklasse heeft drie constructeurs, een paar van die kunt u aangeven dat u wilt dat het namespace-aware zijn.

public XmlSlurper(boolean validating, boolean namespaceAware)

Verklaar de slurper door te bellen new XmlSlurper(false, true). Ik hoop dat dit nuttig is voor anderen.

antwoordde op 24/10/2017 om 16:32
bron van user

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