Groovy的GPath表达式的完整语法是什么?

时间:2010-01-22 14:10:11

标签: groovy

在尝试解析Groovy中的RSS提要时,我发现了一个使用通配符的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

看起来像'spread-dot'运算符一样有趣。我在Groovy网站,书籍等上找不到任何引用

这是如何工作的,更重要的是,你是如何发现这一点的?是否有任何XPath到GPath'Rosetta Stone'那里?

2 个答案:

答案 0 :(得分:19)

嗯,像往常一样,查找信息的最佳位置是Groovy源代码本身 解析的结果是groovy.util.slurpersupport.GPathResult对象。

如果查看源代码(普通java文件),您会看到getProperty(string)方法具有以下特殊运算符:

  • “..”返回父
  • “*”返回所有孩子
  • “**”充当深度第一循环
  • “@”用于访问属性
  • 正常节点访问者。

这就是目前没有其他神奇的关键词。

答案 1 :(得分:3)

所有这些字符串都被视为属性。它们都不是实际的运营商。

呼叫通过GPathResult#getProperty路由,专门检查Gizmo答案中列出的运营商。