Каков полный синтаксис выражений 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.