2009-08-20 8 views
7

में चर का उपयोग करना क्या XmlSlurper को चर के माध्यम से मनमानी तत्व प्राप्त करने का कोई तरीका है? उदा।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() 

मैं {} और इस तरह $ {} और() मैं कैसे बच करते वैरिएबल का उपयोग कर की कोशिश की है: तो मैं इनपुट फ़ाइल की तरह कुछ कर सकते हैं? या कोई रास्ता नहीं है? और क्या तर्कों के परिणाम के रूप में परिणामों का उपयोग करना संभव है? इसलिए मैं की तरह

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

उत्तर

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

यह तत्व नहीं जड़ के तत्काल बच्चों के लिए काम नहीं करता:

इस पर विचार करें। का निरीक्षण करें: डीईएफ़ xmltxt = "" " <रिकॉर्ड नाम =" कुछ रिकॉर्ड "/> <रिकॉर्ड नाम =" कुछ अन्य रिकॉर्ड "/> " "" डीईएफ़ एक्सएमएल = नई XmlSlurper()। ParseText (xmltxt) स्ट्रिंग foo = "something.record" वापसी xml। "$ {Foo}"। आकार() कोई अन्य सुझाव? – Keegan

+0

मुझे किसी भी अच्छे तरीके से पता नहीं है, आप स्ट्रिंग को विभाजित कर सकते हैं: def aNode = xml foo.split ("\\।")। प्रत्येक { aNode = aNode। "$ {It}" } वापसी aNode.size() –

+0

हाँ, स्ट्रिंग अप कार्यों को रोकना, धन्यवाद :) – Keegan

6

यह जवाब एक कोड उदाहरण प्रदान करता है, और अपने जवाब में जॉन डब्ल्यू की टिप्पणी के लिए बहुत कुछ बकाया है कुछ कर सकते हैं।

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

लोग, मूल्यों को आवंटित करने के बारे में क्या? मेरा मतलब है: 'स्ट्रिंग foo = "something.record" xml। "$ {Foo}" = value ' जो आपकी [यहां तक ​​कि @ किगन और @ जॉन।] सलाह काम नहीं करती है :(, कोई सुराग? – Jrr

+0

दोस्तों, मुझे समाधान मिला, मैंने 'def node = getNodes (..) node.replaceBody value' का उपयोग किया .. मुझे लगता है कि मैं XMLSlurper में एक प्रशिक्षु हूं :(। – Jrr

संबंधित मुद्दे