manipulação de Namespace em Groovys XmlSlurper

votos
38

A situação:

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

A saída deste trecho é

# sudo make me a sandwich!

Parece que o analisador se funde o conteúdo de <bar>e <weird:bar>.

É este comportamento desejado e se sim, como posso evitar isso e selecione apenas <bar>ou <weird:bar>?

Publicado 29/12/2011 em 13:31
usuário
Em outras línguas...                            


2 respostas

votos
17

Por XmlSlurper padrão não é namespace ciente. Este pode ser ligado ao declarar namespaces com o 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!"

A saída é:

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

O primeiro printlnainda não serão namespace ciente. A segunda printlnsó vai imprimir a marca sem namespace. Se você se qualificar elemento com o prefixo mostrado na terceira printlnvocê só tem a tag namespace.

Respondeu 29/12/2011 em 14:13
fonte usuário

votos
2

Eu sei que este foi respondida há um tempo atrás, mas aqui está uma alternativa para ninguém enfrentando o mesmo problema. A XmlSlurperclasse tem três construtores, um par de que permitem que você especifique que você quer que ele seja namespace-aware.

public XmlSlurper(boolean validating, boolean namespaceAware)

Declarar a Slurper chamando new XmlSlurper(false, true). Espero que este seja útil para os outros.

Respondeu 24/10/2017 em 16:32
fonte usuário

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