Pergunta

Eu estou tentando determinar se um elemento XML existe com XmlSlurper do Groovy. Existe uma maneira de fazer isso? Por exemplo:

<foo>
  <bar/>
</foo>

Como posso verificar se o elemento bar existe?

Foi útil?

Solução

A API é um pouco maluco, mas eu acho que há um par de melhores maneiras de olhar para as crianças. O que você está recebendo quando você pedir "xml.bar" (que existe) ou "xml.quux", que não faz, é um groovy.util.slurpersupport.NodeChildren objeto. Basicamente uma coleção de nós que satisfazem os critérios que você pediu.

Uma maneira de ver se um determinado nó existe é para verificar o tamanho do NodeChildren é o tamanho esperado:

def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert 1 == xml.bar.size()
assert 0 == xml.quux.size()

Outra forma seria usar o método find e ver se o nome do nó que será devolvido (infelizmente algo é sempre devolvido), é o que você estava esperando:

def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert ("bar" == xml.children().find( {it.name() == "bar"})?.name())
assert ("quux" != xml.children().find( {it.name() == "quux"})?.name())

Outras dicas

O método isEmpty em GPathResult funciona.

def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert false == xml.bar.isEmpty()

Incomoda-me, porque o elemento bar é esvaziar - ele não tem um corpo. Mas suponho que o GPathResult não estiver vazia, então talvez isso faz sentido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top