xmlparser traverse gpathresult example convert xml groovy xmlslurper

traverse - ¿Cómo puedo verificar la existencia de un elemento con XmlSlurper de Groovy?



traverse xml groovy (2)

Estoy tratando de determinar si existe un elemento XML con XmlSlurper de Groovy. ¿Hay alguna forma de hacer esto? Por ejemplo:

<foo> <bar/> </foo>

¿Cómo puedo verificar si el elemento de barra existe?


El método isEmpty en GPathResult funciona.

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

Esto me molesta, porque el elemento de barra está vacío, no tiene cuerpo. Pero supongo que GPathResult no está vacío, así que quizás esto tenga sentido.


La API es un poco complicada, pero creo que hay un par de formas mejores de buscar niños. Lo que obtendrás cuando solicites "xml.bar" (que existe) o "xml.quux", que no es, es un objeto groovy.util.slurpersupport.NodeChildren . Básicamente, una colección de nodos que cumplen los criterios que usted solicitó.

Una forma de ver si existe un nodo en particular es verificar que el tamaño de NodeChildren sea el tamaño esperado:

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

Otra forma sería usar el método find y ver si el nombre del nodo que se devuelve (desafortunadamente siempre se devuelve algo), es el que se esperaba:

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())