Как я могу проверить наличие элемента в Groovy XmlSlurper? - PullRequest
32 голосов
/ 26 января 2009

Я пытаюсь определить, существует ли элемент XML с помощью Groovy XmlSlurper. Есть ли способ сделать это? Например:

<foo>
  <bar/>
</foo>

Как проверить, существует ли элемент bar?

Ответы [ 2 ]

37 голосов
/ 27 января 2009

API немного странный, но я думаю, что есть пара лучших способов поиска детей. Когда вы запрашиваете «xml.bar» (который существует) или «xml.quux», которого нет, вы получаете объект groovy.util.slurpersupport.NodeChildren . В основном это набор узлов, отвечающих заданным вами критериям.

Один из способов проверить, существует ли конкретный узел, - это проверить размер NodeChildren на ожидаемый размер:

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

Другим способом было бы использовать метод find и посмотреть, является ли ожидаемое имя возвращаемого узла (к сожалению, что-то всегда возвращается):

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())
17 голосов
/ 26 января 2009

Метод isEmpty в GPathResult работает.

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

Это беспокоит меня, потому что элемент бара пуст - у него нет тела. Но я полагаю, что GPathResult не пустой, так что, возможно, это имеет смысл.

...