有没有办法让XmlSlurper通过变量获取任意元素? 例如所以我可以做点什么 输入文件:
<file>
<record name="some record" />
<record name="some other record" />
</file>
def xml = new XmlSlurper().parse(inputFile)
String foo = "record"
return xml.{foo}.size()
我尝试过使用{}和$ {}和()如何转义这样的变量?或者没有办法? 是否可以使用闭包的结果作为参数?所以我可以做类似
的事情String foo = file.record
int numRecords = xml.{foo.find(/.\w+$/)}
答案 0 :(得分:8)
import groovy.xml.*
def xmltxt = """<file>
<record name="some record" />
<record name="some other record" />
</file>"""
def xml = new XmlSlurper().parseText(xmltxt)
String foo = "record"
return xml."${foo}".size()
答案 1 :(得分:6)
这个答案提供了一个代码示例,并且很大程度上归功于John W在他的回答中的评论。
考虑一下:
import groovy.util.*
def xml = """<root>
<element1>foo</element1>
<element2>bar</element2>
<items>
<item>
<name>a</name>
<desc>b</desc>
</item>
<item>
<name>c</name>
<desc>x</desc>
</item>
</items>
</root>"""
def getNodes = { doc, path ->
def nodes = doc
path.split("\\.").each { nodes = nodes."${it}" }
return nodes
}
def resource = new XmlSlurper().parseText(xml)
def xpaths = ['/root/element1','/root/items/item/name']
xpaths.each { xpath ->
def trimXPath = xpath.replace("/root/", "").replace("/",".")
println "xpath = ${trimXPath}"
getNodes(resource, trimXPath).each { println it }
}
答案 2 :(得分:0)
基于 Michael 的解决方案,这提供了对索引的支持,例如 '/root/element1[1]'
def getNodes = { doc, path ->
def nodes = doc
path.split("\\.").each {
if (it.endsWith(']'))
{
def name_index = it.tokenize('[]') // "attributes[1]" => ["attributes", "1"]
nodes = nodes."${name_index[0]}"[name_index[1].toInteger()]
}
else nodes = nodes."${it}"
}
return nodes
}