Как проверить наличие элемента с Groovy XmlSlurper?
Я пытаюсь определить, существует ли XML-элемент с Groovy XmlSlurper. Есть ли способ сделать это? Например:
<foo>
<bar/>
</foo>
Как проверить, существует ли элемент панели?
Ответ 1
API немного застенчив, но я думаю, что есть несколько лучших способов поиска детей. То, что вы получаете, когда вы запрашиваете "xml.bar" (который существует) или "xml.quux", что нет, является groovy. util.slurpersupport.NodeChildren. В основном набор узлов, отвечающих критериям, которые вы просили.
Один из способов увидеть, существует ли конкретный node, - это проверить размер ожидаемого размера NodeChildren:
def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert 1 == xml.bar.size()
assert 0 == xml.quux.size()
Другим способом было бы использовать метод find и посмотреть, возвращается ли возвращаемое имя node (к сожалению, что-то всегда возвращается), это тот, который вы ожидали:
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())
Ответ 2
Метод isEmpty на GPathResult работает.
def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert false == xml.bar.isEmpty()
Это беспокоит меня, потому что элемент пуст - он не имеет тела. Но я полагаю, что GPathResult не пуст, так что, возможно, это имеет смысл.