Проблема в том, что javadoc isEmpty не определяет «пустую» семантику. Кажется, что isEmpty проверяется не на содержимом элемента, а на контейнере элемента, например, xml.bar - это контейнер всех элементов bar в xml, поэтому isEmpty будет иметь значение false, если в контейнере есть одна строка.

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

<foo>
  <bar/>
</foo>

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

Ответы на вопрос(2)

Решение Вопроса

но я думаю, что есть пара лучших способов поиска детей. То, что вы получаете, когда спрашиваете «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())
 Stephen Swensen22 мая 2012 г., 05:37
По крайней мере, на Groovy 1.8.6,GPathResult есть методboolean isEmpty() который реализован какreturn size() == 0;

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

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

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

 Ted Naleid28 янв. 2009 г., 07:21
Мне больше нравится метод size (), так как я думаю, что он немного менее запутан, но причина в том, что метод возвращаетEmpty false, потому что он говорит о возвращаемой коллекции NodeChildren. Он не пустой, потому что есть "bar", и isEmpty будет верным для xml.quux, потому что нет quux
 Josh Brown28 янв. 2009 г., 17:27
Я понимаю и думаю, что вы правы - метод size () немного менее запутан. Еще раз спасибо за ваш ответ, Тед.
 Pablo Pazos17 февр. 2018 г., 18:12
Проблема в том, что javadoc isEmpty не определяет «пустую» семантику. Кажется, что isEmpty проверяется не на содержимом элемента, а на контейнере элемента, например, xml.bar - это контейнер всех элементов bar в xml, поэтому isEmpty будет иметь значение false, если в контейнере есть одна строка.

Ваш ответ на вопрос