Каков полный синтаксис выражений Groovy GPath?

При попытке проанализировать RSS-каналы в Groovy, я нашел пример GPath с использованием подстановочных знаков:

def text = """ 
<data> 
   <common-tables> 
    <table name="address"/> 
    <table name="phone"/> 
  </common-tables> 

  <special-tables> 
    <table name="person"/> 
  </special-tables> 

  <other-tables> 
    <table name="business"/> 
  </other-tables> 
</data> 
""" 

def xml = new XmlParser().parse(new ByteArrayInputStream(text.getBytes())) 
def tables = xml.'**'.table.findAll{ it.parent().name() == 
"special-tables" || it.parent().name

(из http://old.nabble.com/Q:-Avoiding-XPath---using-GPath-td19087210.html)

Похоже на забавное использование оператора "спред-точка". Я не могу найти ссылку на это на сайте Groovy, в книгах и т.д.

Как это работает, и что более важно, как вы это обнаружите? Есть ли какой-нибудь XPath для GPath "Rosetta Stone"?

Ответ 1

Хорошо, как обычно, лучшее место для поиска информации находится в самом источнике Groovy.
Результатом синтаксического анализа является объект groovy.util.slurpersupport.GPathResult.

Если вы посмотрите на исходный файл (простой Java файл), вы увидите, что метод getProperty (string) имеет следующие специальные операторы:

  • "..", который возвращает родительский
  • "*", который возвращает все дочерние элементы
  • "**", которые действуют как первый цикл глубины
  • "@", который используется для доступа к свойству
  • обычный node аксессор.

Это все, никаких других волшебных ключевых слов на данный момент.

Ответ 2

Все эти строки рассматриваются как свойства. Ни один из них фактически не является оператором.

Вызовы маршрутизируются через GPathResult # getProperty, который специально проверяет операторов, перечисленных в ответе gizmo.