2009-08-20 10 views
7

Gibt es eine Möglichkeit, XmlSlurper beliebige Elemente durch eine Variable erhalten? z.B. so kann ich so etwas wie Eingabedatei tun:Verwenden von Variablen in XmlSlurper GPath

<file> 
    <record name="some record" /> 
    <record name="some other record" /> 
</file> 

def xml = new XmlSlurper().parse(inputFile) 
String foo = "record" 
return xml.{foo}.size() 

Ich habe versucht, mit {} und $ {} und() Wie entkommen ich Variablen wie das? Oder gibt es nicht einen Weg? und ist es möglich, auch Ergebnisse von Schließungen als Argumente zu verwenden? So konnte ich so etwas wie

String foo = file.record 
int numRecords = xml.{foo.find(/.\w+$/)} 

Antwort

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() 
+0

Dies funktioniert nicht für Elemente, die nicht unmittelbaren Kinder der Wurzel. Beachten Sie: def xmltxt = "" " """ def xml = new XmlSlurper(). ParseText (xmltxt) Zeichenfolge foo = "something.record" Rückgabe xml. "$ {Foo}". Size() Weitere Vorschläge? – Keegan

+0

Ich kenne keinen guten Weg, Sie könnten die Zeichenfolge teilen: def aNode = xml foo.split ("\\."). Jeder { aNode = aNode. "$ {It}" } zurück aNode.size() –

+0

Ja, hacken die String up funktioniert, danke :) – Keegan

6

tut Diese Antwort bietet ein Codebeispiel, und viel zu verdanken John W Kommentar in seiner Antwort.

Bedenken Sie:

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 } 
} 
+0

Leute, was ist mit Werten? Ich meine: 'String foo =" something.record " xml." $ {Foo} "= Wert ' was Ihre [gerade @Keegan und, @ John.W] Beratung nicht funktioniert :(, irgendeinen Hinweis? – Jrr

+0

Leute, ich habe die Lösung gefunden, ich habe 'def node = getNodes (..) node.replaceBody value' verwendet. Ich sehe, dass ich ein Praktikant in XMLSlurper bin :(. – Jrr

Verwandte Themen