在XmlSlurper的GPath中使用变量

时间:2009-08-20 18:12:00

标签: xml groovy

有没有办法让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+$/)}

3 个答案:

答案 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
}