Groovy 带有XmlSlurper和findAll的嵌套GPath表达式

Groovy 带有XmlSlurper和findAll的嵌套GPath表达式,groovy,xmlslurper,gpath,Groovy,Xmlslurper,Gpath,我试图使用XmlSlurper和GPath分析XML树,而findAll方法的行为让我感到困惑 例如,假设您有以下XML树: <html> <body> <ul> <li class="odd"><span>Element 1</span></li> <li class="even"><span>Element 2&l

我试图使用
XmlSlurper
和GPath分析XML树,而
findAll
方法的行为让我感到困惑

例如,假设您有以下XML树:

<html>
    <body>
        <ul>
            <li class="odd"><span>Element 1</span></li>
            <li class="even"><span>Element 2</span></li>
            <li class="odd"><span>Element 3</span></li>
            <li class="even"><span>Element 4</span></li>
            <li class="odd"><span>Element 5</span></li>
        </ul>
    </body>
</html>
另一方面:

// Doesn't print anything.
xml.body.ul.li.findAll {it.@class == 'odd'}.span.each {println it.text()}
我很难理解为什么我可以使用特殊的
@
属性(以及其他属性,如
**
),但不能使用“普通”属性

我看过API代码,更让我困惑的是
getProperty
实现(在
GPathResult
中找到)似乎支持我正在尝试的操作


我遗漏了什么?

您需要迭代每个
span
,以便可以使用扩展点运算符:

xml.body.ul.li.findAll {it.@class == 'odd'}*.span.each {println it.text()}

+1对于扩展点运算符,它很好地解决了特定问题!这并不能解释
@class
属性和
span
属性之间的行为差异,或者我遗漏了什么吗?@NicolasRinaudo不是100%确定,深入研究代码也没有大的帮助
@class
紧随其后,只是。。。好像FilteredNodeList中缺少了什么。。。等我有时间的时候,我会调查更多的…谢谢你这么久才沉迷其中。我自己也得出了同样的结论——看起来它应该支持
.span
调用,但似乎不起作用。如果Groovy是一种我比较自信的语言,我可能会提交一份bug报告,但是Groovy有一种倾向,它的行为方式不符合我所期望的完美的逻辑和正确的方式。@NicolasRinaudo我认为这个bug是一样的,所以希望它能很快得到修复
xml.body.ul.li.findAll {it.@class == 'odd'}*.span.each {println it.text()}