URL 迭代
理解了如何遍历 File 后,可以使用相同的原则遍历 HTTP 请求的响应。Groovy 为 java.net.URL 提供了一个方便的(和熟悉的)eachLine() 方法。
例如,清单 24 将逐行遍历 ibm.com 主页的 HTML:
清单 24. URL 迭代
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 文件
<language>Java</language>
<language>Groovy</language>
<language>JavaScript</language>
</langs>
Groovy 提供了一个 each() 方法,但是需要做一些修改。如果使用名为 XmlSlurper 的原生 Groovy 类解析 XML,那么可以使用 each() 遍历元素。参见清单 26 所示的例子:
清单 26. XML 迭代
langs.language.each{
println it
}
//output
Java
Groovy
JavaScript
langs.language.each 语句从名为
如果觉得这还不够的话,那么假设这个 XML 是通过一个 RESTful Web 服务的形式获得,而不是文件系统中的文件。使用一个 URL 替换文件的路径,其余代码仍然保持不变,如清单 27 所示:
清单 27. Web 服务调用的 XML 迭代
langs.language.each{
println it
}
这真是个好方法,each() 方法在这里用得很好,不是吗?