Как я могу проверить существование элемента с помощью XmlSlurper от Groovy?

StackOverflow https://stackoverflow.com/questions/480431

  •  20-08-2019
  •  | 
  •  

Вопрос

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

<foo>
  <bar/>
</foo>

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

Это было полезно?

Решение

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

Другие советы

Метод isEmpty для GPathResult работает.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top