Como posso verificar a existência de um elemento com XmlSlurper do Groovy?
-
20-08-2019 - |
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?
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.