使用字符串作为Groovy XML解析器的代码

使用字符串作为Groovy XML解析器的代码,groovy,xml-parsing,Groovy,Xml Parsing,我是groovy新手-我希望这是一个简单的问题来解决。我正在阅读xml文档,然后我能够访问如下数据: def root = new XmlParser().parseText(xmlString) println root.foo.bar.text() def paths = ["foo.bar","tashiStation.powerConverter"] // defined for this example paths.each { path -> println

我是groovy新手-我希望这是一个简单的问题来解决。我正在阅读xml文档,然后我能够访问如下数据:

def root = new XmlParser().parseText(xmlString)
println root.foo.bar.text()
def paths = ["foo.bar","tashiStation.powerConverter"] // defined for this example
paths.each { 
    path ->
    println path + "\t" + root.path.text()
}
我想做的是从文件或数据库加载路径的“foo.bar”部分,这样我就可以执行以下操作:

def root = new XmlParser().parseText(xmlString)
println root.foo.bar.text()
def paths = ["foo.bar","tashiStation.powerConverter"] // defined for this example
paths.each { 
    path ->
    println path + "\t" + root.path.text()
}
显然,编写的代码不起作用。。。我想也许这会奏效:

paths.each { 
    path ->
    println path + "\t" + root."${path}".text()
}
……但事实并非如此。我的初始解决方案基于Groovy for DSL的第153页,其中可以以类似的方式创建动态方法

想法?理想的解决方案不会添加大量代码,也不会添加任何额外的库依赖项。我总是可以用JDOM在Java中做这些事情,但我希望有一个优雅的groovy解决方案

这与和非常相似

基本上,您需要在
上拆分路径,然后沿着此列表遍历对象图

def val = path.split( /\./ ).inject( root ) { obj, node -> obj?."$node" }?.text()
println "$path\t$val"

在这种情况下应该这样做:-)

可能重复的@tim_yates:在我看来根本不一样。。。在每次迭代中插入对GroovyShell的调用会带来不必要的开销GroovyShell@tim_yates:答案建议使用Eval,这只是GroovyShell顶部的一个助手,对吗?不,它首先建议如下所示,然后提供
Eval
作为替代方案(显然,更糟糕的是,正如您正确指出的,它重新解析属性字符串以计算其值)有效!现在我需要阅读它的工作原理,但非常感谢您提供的解决方案。