manejo de espacio de nombres en Groovys XmlSlurper

votos
38

La situación:

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

La salida de este fragmento es

# sudo make me a sandwich!

Parece que el analizador se fusiona el contenido de <bar>y <weird:bar>.

Este comportamiento se desea y si es así, ¿cómo puedo evitar esto y seleccionar solo <bar>o <weird:bar>?

Publicado el 29/12/2011 a las 13:31
por usuario
En otros idiomas...                            


2 respuestas

votos
17

Por XMLSlurper por defecto no está al tanto de espacio de nombres. Esto se puede activar al declarar espacios de nombres con el declareNamespace método .

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

La salida es:

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

La primera printlnsigue sin ser consciente de espacio de nombres. La segunda printlnsólo imprimirá la etiqueta sin espacio de nombres. Si reúne los requisitos elemento con el prefijo se muestra en la tercera printlnque sólo recibe la etiqueta de espacio de nombres.

Respondida el 29/12/2011 a las 14:13
fuente por usuario

votos
2

Sé que esto fue respondida hace un tiempo, pero aquí es una alternativa para nadie más frente al mismo problema. La XmlSlurperclase tiene tres constructores, un par de los cuales le permiten especificar que quiere que sea consciente de espacio de nombres.

public XmlSlurper(boolean validating, boolean namespaceAware)

Declarar la Slurper llamando new XmlSlurper(false, true). Espero que esto sea útil a los demás.

Respondida el 24/10/2017 a las 13:32
fuente por usuario

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