Come posso verificare l'esistenza di un elemento con XmlSlurper di Groovy?
-
20-08-2019 - |
Domanda
Sto cercando di determinare se esiste un elemento XML con XmlSlurper di Groovy. C'è un modo per fare questo? Ad esempio:
<foo>
<bar/>
</foo>
Come posso verificare se esiste l'elemento bar?
Soluzione
L'API è un po 'complicata, ma penso che ci siano un paio di modi migliori per cercare figli. Cosa ottieni quando chiedi & Quot; xml.bar & Quot; (che esiste) o " xml.quux " che non lo è, è un groovy.util.slurpersupport.NodeChildren oggetto. Fondamentalmente una raccolta di nodi che soddisfano i criteri richiesti.
Un modo per vedere se esiste un nodo particolare è verificare la dimensione di NodeChildren è la dimensione prevista:
def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert 1 == xml.bar.size()
assert 0 == xml.quux.size()
Un altro modo sarebbe usare il metodo find e vedere se il nome del nodo che viene restituito (purtroppo viene sempre restituito qualcosa), è quello che ti aspettavi:
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())
Altri suggerimenti
Il metodo isEmpty su GPathResult funziona.
def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert false == xml.bar.isEmpty()
Questo mi dà fastidio, perché l'elemento della barra è vuoto - non ha un corpo. Ma suppongo che GPathResult non sia vuoto, quindi forse questo ha senso.