2009-08-20 5 views
7

¿Hay alguna manera de que XmlSlurper obtenga elementos arbitrarios a través de una variable? p. por lo que puedo hacer algo como archivo de entrada :Usando variables en XmlSlurper's 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() 

He intentado usar {} y {} $ y() ¿cómo escapar de las variables de ese tipo? ¿O no hay una manera? y ¿es posible usar los resultados de los cierres como los argumentos también? Así que podría hacer algo como

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

Respuesta

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

Esto no funciona para los elementos no niños inmediatas de la raíz. Observe: def xmltxt = "" " """ definición XML = new XmlSlurper(). ParseText (xmltxt) Cadena foo = "something.record" return xml. "$ {Foo}". Size() ¿Alguna otra sugerencia? – Keegan

+0

No sé de ninguna buena manera, podría dividir la cadena: def aNode = xml foo.split ("\\."). Cada uno { aNode = aNode. "$ {It}" } return aNode.size() –

+0

Sí, cortando los trabajos de String up, gracias :) – Keegan

6

Esta respuesta ofrece un ejemplo de código, y debe mucho al comentario de John W en su respuesta.

Considera:

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

Gente, ¿qué tal asignar valores? Quiero decir: 'String foo =" something.record " xml." $ {Foo} "= valor ' que su asesoría [incluso @Keegan y @ John.W] no funciona :(, ¿hay alguna pista? – Jrr

+0

Amigos, encontré la solución, utilicé 'def node = getNodes (..) node.replaceBody value' .. Veo que soy un aprendiz en XMLSlurper :(. – Jrr

Cuestiones relacionadas