使用XmlSlurper和findAll的嵌套GPath表达式

时间:2013-04-10 14:09:22

标签: 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</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>

假设xml已通过XmlSlurper parse方法之一初始化,则以下代码按预期执行:

// Prints:
// odd
// odd
// odd
xml.body.ul.li.findAll {it.@class == 'odd'}.@class.each {println it.text()}

另一方面:

// Doesn't print anything.
xml.body.ul.li.findAll {it.@class == 'odd'}.span.each {println it.text()}

我很难理解为什么我可以使用特殊@属性(以及其他属性,例如**),但不能正常使用#{1}}属性。的。

我已经查看了API代码,更令我困惑的是getProperty实现(在GPathResult中找到)似乎支持我尝试做的事情

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您需要遍历每个span,因此您可以使用spread-dot运算符:

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