English 中文(简体)
Groovy - how to exit each loop?
原标题:

I m new to Grails/Groovy and am trying to find a node in a an xml file; I ve figured out how to iterate over all of them, but I want to exit the loop when the target node is found. I ve read that instead of using "each", use "find", but the find examples I ve seen are conditions. Right now the logic I have is going to iterate through the whole file without exiting. The code is below:

  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
     
    }
   }
  }
最佳回答

You cannot do it elegantly. You might see some people suggest throwing an Exception, but that s just plain ugly.

Here s some mailing list discussion on using each vs. for, and a couple people say that for is preferred because of each s inability to break from the iteration.

Your best bet is probably to change over to a for loop and iterate:

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

Either that, or like you said, maybe use find or findAll to find the element you re looking for (the following code is paraphrased, I don t have time yet to test it out):

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

Related SO questions:

问题回答

Replace each loop with any or find closure.

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

    println element

    if (element == 3)
        true // break
}

Output

1
3

Regarding breaking out of the each loop see: is it possible to break out of a groovy closure

Basically you have to throw and exception and catch it. The "break" keyword is only allowed inside loops not iterated "closures" (really code blocks).

You can use any complex code with "find" just make sure the function you call returns a Boolean. For example:

Boolean test(val) {
    println "Testing $val"
    return val == 1
}

def found = [3,4,5,1,6,3].find { test(it) }

println "Found $found"

I think this should work too, stopping at the first match.

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




相关问题
how to represent it in dtd?

I have two element action and guid. guid is a required field when action is add. but when action is del it will not appear in file. How to represent this in dtd ?

.Net application configuration add xml-data

I need to add xml-content to my application configuration file. Is there a way to add it directly to the appSettings section or do I need to implement a configSection? Is it possible to add the xml ...

XStream serializing collections

I have a class structure that I would like to serialize with Xstream. The root class contains a collection of other objects (of varying types). I would like to only serialize part of the objects that ...

MS Word splits words in its XML format

I have a Word 2003 document saved as a XML in WordProcessingML format. It contains few placeholders which will be dynamically replaced by an appropriate content. But, the problem is that Word ...

Merging an XML file with a list of changes

I have two XML files that are generated by another application I have no control over. The first is a settings file, and the second is a list of changes that should be applied to the first. Main ...

How do I check if a node has no siblings?

I have a org.w3c.dom.Node object. I would like to see if it has any other siblings. Here s what I have tried: Node sibling = node.getNextSibling(); if(sibling == null) return true; else ...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

热门标签