2011-08-11 18 views

Respuesta

25

Aquí es el fragmento correspondiente:

def node = new XmlSlurper().parseText(...) 
def foo = node.depthFirst().findAll { it.name() == 'div' && [email protected] == 'foo'} 

Algunos otros enlaces es posible que desee leer:

+3

Es maravilloso, no GPath. Necesito una sola expresión GPath. – yegor256

+3

No estoy muy seguro de lo que quiere decir, ya que GPath usa principalmente sintaxis maravillosa con los siguientes símbolos adicionales: "..." que devuelve el padre "*" que devuelve todos los hijos "**" que actúan como profundidad primer ciclo "@" que se usa para acceder a una propiedad del acceso nodal normal. –

+1

Estoy buscando algo como '" ..div {it. @ Id == 'foo'} "', pero no funciona ... – yegor256

7

El comentario anterior dio a todos eso es obligatorio: suponiendo que su documento ha sido absorbido por xml, usted quiere

def foo = xml.path.to.div.find{[email protected] == 'foo'} 

para encontrar un solo resultado. O findAll para encontrar todos los resultados.

+0

'//' en XPath significa que no conozco la ruta exacta a 'div' – yegor256

+1

bien. luego el póster anterior le dio la solución: - use 'xml.depthFirst(). find {it.name() == 'div' && id. @ id == 'foo}' – winstaan74

+0

@ winstaan74 ¿Cuál es la expresión para obtener todo elementos con un nombre de atributo específico? – raffian

1

lo que necesita es la siguiente:

def root = new XmlSlurper().parseText(<locOfXmlFileYouAreParsing>.toURL().text) 

def foundNode = root.'**'.find{ [email protected] == "foo" } 

su doble * que le permitirá encontrar sin saber el camino. Al menos así es como lo hago.

+1

¿Cómo se encuentra la primera instancia de un nodo por nombre de elemento, suponiendo que hay más de uno? – raffian

+0

'xml. '**'. Find {it.name() == 'elementName'}' Y ese será el primero. –

1

para imitar la expresión // div [@ id = 'foo'] lo más cercano que se puede hacer con un GPath es:

def xml = new XmlParser().parseText(text) 
xml.'**'.div.findAll { [email protected]=="foo" } 

la '**' es más o menos lo mismo que '//'en tu XPath.

xml.'**'.div 

dará todos los nodos de tipo div en cualquier nivel.

Posteriormente filtrado con findAll() con el cierre dado se obtiene una lista de nodos como lo hace en el caso de XPath

Cuestiones relacionadas