Использование переменных в GPath XmlSlurper - PullRequest
7 голосов
/ 20 августа 2009

Есть ли способ заставить 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+$/)}

Ответы [ 2 ]

8 голосов
/ 21 августа 2009
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()
6 голосов
/ 13 октября 2012

Этот ответ предлагает пример кода и во многом обязан комментарию Джона В. в его ответе.

Учтите это:

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 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...