Wie kann ich mit Groovys XmlSlurper auf die Existenz eines Elements überprüfen?

Ich versuche zu ermitteln, ob ein XML-Element mit Groovys XmlSlurper vorhanden ist. Gibt es eine Möglichkeit, dies zu tun? Beispiel:

<foo>
  <bar/>
</foo>

Wie prüfe ich, ob das Balkenelement vorhanden ist?

Antwort auf "Wie kann ich mit Groovys XmlSlurper auf die Existenz eines Elements überprüfen? " 2 von antworten

Die isEmpty-Methode auf GPathResult funktioniert.

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

Das stört mich, denn das Balkenelement ist leer - es hat keinen Körper. Aber ich nehme an, das GPathResult ist nicht leer, also macht das vielleicht Sinn.

Die API ist ein wenig schraubig, aber ich denke, dass es ein paar bessere Möglichkeiten gibt, nach Kindern zu suchen. Was Sie bekommen, wenn Sie nach "xml.bar" (die existiert) oder "xml.quux" fragen, was nicht, ist ein groovy.util.slurpersupport.NodeChildren object. Basically a collection of nodes meeting the criteria that you asked for. Objekt. Im Grunde eine Sammlung von Knoten, die die von Ihnen angeforderten Kriterien erfüllen.

Eine Möglichkeit, um zu sehen, ob ein bestimmter Knoten vorhanden ist, ist die erwartete Größe der NodeChildren zu überprüfen:

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

Eine andere Möglichkeit wäre, die Find-Methode zu verwenden und zu sehen, ob der Name des Knotens, der zurückgegeben wird (leider wird immer etwas zurückgegeben), der erwartete, der ist, den Sie erwartet haben:

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