技术开发 频道

实战 Groovy: for each 剖析

  URL 迭代

  理解了如何遍历 File 后,可以使用相同的原则遍历 HTTP 请求的响应。Groovy 为 java.net.URL 提供了一个方便的(和熟悉的)eachLine() 方法。

  例如,清单 24 将逐行遍历 ibm.com 主页的 HTML:

  清单 24. URL 迭代  

def url = new URL("http://www.ibm.com")

  url.eachLine{line
->

  println line

  }

  当然,如果这就是您的目的的话,Groovy 提供了一个只包含一行代码的解决办法,这主要归功于 toURL() 方法,它被添加到所有 Strings:"http://www.ibm.com".toURL().eachLine{ println it }。

  但是,如果希望对 HTTP 响应执行一些更有用的操作,该怎么办呢?具体来讲,如果发出的请求指向一个 RESTful Web 服务,而该服务包含您要解析的 XML,该怎么做呢?each() 方法将在这种情况下提供帮助。 

  XML 迭代

  您已经了解了如何对文件和 URL 使用 eachLine() 方法。XML 给出了一个稍微有些不同的问题 — 与逐行遍历 XML 文档相比,您可能更希望对逐个元素进行遍历。

  例如,假设您的语言列表存储在名为 languages.xml 的文件中,如清单 25 所示:

  清单 25. languages.xml 文件    

<langs>
  
<language>Java</language>
  
<language>Groovy</language>
  
<language>JavaScript</language>
</langs>

  Groovy 提供了一个 each() 方法,但是需要做一些修改。如果使用名为 XmlSlurper 的原生 Groovy 类解析 XML,那么可以使用 each() 遍历元素。参见清单 26 所示的例子:

  清单 26. XML 迭代  

def langs = new XmlSlurper().parse("languages.xml")

  langs.language.each{

  println it

  }

  
//output

  Java

  Groovy

  JavaScript

  langs.language.each 语句从名为 提取所有元素。如果同时拥有 元素,它们将不会出现在 each() 方法的输出中。

  如果觉得这还不够的话,那么假设这个 XML 是通过一个 RESTful Web 服务的形式获得,而不是文件系统中的文件。使用一个 URL 替换文件的路径,其余代码仍然保持不变,如清单 27 所示:

  清单 27. Web 服务调用的 XML 迭代  

def langs = new XmlSlurper().parse("http://somewhere.com/languages")

  langs.language.each{

  println it

  }

  这真是个好方法,each() 方法在这里用得很好,不是吗?

0
相关文章