我在这里找到了一些有用的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方法搜索每个节点?还有什么其他的字符串会有用吗?这是在某处记录的吗?
答案 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
我无法想到其他任何地方这种事情都会发生在groovy中,XML解析是一种特殊情况