Groovy语法 - '**'xml方法是什么样的东西?

时间:2015-07-10 18:59:50

标签: xml groovy

我在这里找到了一些有用的xml操作代码: http://www.groovy-lang.org/processing-xml.html

它给出了以下有用的例子:

def response = new XmlSlurper().parseText(books)
def titles = response.'**'.findAll{ node-> node.name() == 'title' }*.text()

我知道它是一个通配符约定,但'**'字符串究竟如何指示findAll方法搜索每个节点?还有什么其他的字符串会有用吗?这是在某处记录的吗?

2 个答案:

答案 0 :(得分:1)

它是depthFirst()的捷径。请参阅GPathResult#getProperty(String)的API文档:

  

返回此GPathResult的指定属性。

     

实现以下快捷方式:

'..' for parent()
'*' for children()
'**' for depthFirst()
'@' for attribute access

关于getProperty如何做到这一点,这里是来自GPathResult的代码:

 public Object getProperty(final String property) {
    if ("..".equals(property)) {
        return parent();
    } else if ("*".equals(property)) {
        return children();
    } else if ("**".equals(property)) {
        return depthFirst();
    } else if (property.startsWith("@")) {
        if (property.indexOf(":") != -1) {
            final int i = property.indexOf(":");
            return new Attributes(this, "@" + property.substring(i + 1), property.substring(1, i), this.namespaceTagHints);
        } else {
            return new Attributes(this, property, this.namespaceTagHints);
        }
    } else {
        if (property.indexOf(":") != -1) {
            final int i = property.indexOf(":");
            return new NodeChildren(this, property.substring(i + 1), property.substring(0, i), this.namespaceTagHints);
        } else {
            return new NodeChildren(this, property, this.namespaceTagHints);
        }
    }
}

我一直期待看到某种使用missingProperty或其他东西的元编程hackery,但这里并不需要。对response.'**'的调用被视为访问属性,使用' **'来调用getProperty。作为论点传入。

答案 1 :(得分:1)

这是depthFirst

的别名

此处记录http://docs.groovy-lang.org/latest/html/api/groovy/util/slurpersupport/GPathResult.html#getProperty(java.lang.String)

我无法想到其他任何地方这种事情都会发生在groovy中,XML解析是一种特殊情况