traverse gpathresult convert xml grails groovy

xml - gpathresult - Groovy: ¿cómo salir de cada ciclo?



groovy xml (4)

Creo que esto debería funcionar también, deteniéndome en el primer partido.

def result = records.children().find { domain -> if (domain.@domain_name == targetDomain) { // Do stuff ... return true } else { return false } }

Soy nuevo en Grails / Groovy y estoy tratando de encontrar un nodo en un archivo xml; He descubierto cómo iterar sobre todos ellos, pero quiero salir del bucle cuando se encuentra el nodo de destino. He leído que en lugar de usar "cada", usa "buscar", pero los ejemplos de búsqueda que he visto son condiciones. En este momento, la lógica que tengo va a iterar a través de todo el archivo sin salir. El código está abajo:

records.children().each {domain -> println "domain_name: " + domain.@domain_name if (domain.@domain_name == targetDomain) { println "target domain matched: " + domain.@domain_name domain.children().each {misc_field -> println "field_name: " + misc_field.@field_name println "field_type: " + misc_field.@field_type println "field_value: " + misc_field } } }


En cuanto a la ruptura de cada bucle ver: ¿ is-it-possible-to-break-out-of-closure-in-groovy

Básicamente tienes que lanzar y hacer excepciones y atraparlo. La palabra clave "break" solo está permitida dentro de los bucles no iterados "closures" (realmente bloques de código).

Puede usar cualquier código complejo con "buscar" simplemente asegúrese de que la función a la que llama devuelva un booleano. Por ejemplo:

Boolean test(val) { println "Testing $val" return val == 1 } def found = [3,4,5,1,6,3].find { test(it) } println "Found $found"


No puedes hacerlo elegantemente. Es posible que veas que algunas personas sugieren lanzar una excepción, pero eso es simplemente feo .

Aquí hay una discusión de la lista de correo electrónico sobre el uso de each for , y un par de personas dicen que es preferible debido a la incapacidad de each de romper con la iteración.

Su mejor opción es, probablemente, cambiar a un bucle for e iterar:

for(def domain : records.children()) { // this may need some tweaking depending on types // do stuff if(condition) { break; } }

O eso, o como dijiste, tal vez uses find o findAll para encontrar el elemento que estás buscando (el siguiente código está parafraseado, todavía no tengo tiempo para probarlo):

def result = records.children().find { domain -> domain.@domain_name == targetDomain } result.children().each { // print stuff }

Preguntas SO relacionadas:


Reemplace cada lazo con alguno o encuentre el cierre.

def list = [1, 2, 3, 4, 5] list.any { element -> if (element == 2) return // continue println element if (element == 3) true // break }

Salida

1 3