Skip to end of metadata
Go to start of metadata
Icon

以下示例只是代码片断,不能直接运行。

Groovy 原生支持各种标记语言,如 XML、HTML、SAX、W3C DOM、Ant tasks、Swing 用户接口 等等。
可以通过以下语法实现:

不管使用哪种 builder 语法都是一样的。上述代码的意思是 someBuilder 对象有个‘people’方法,它有两个参数:

  • 一个传递参数的 Map:['kind':'folks', 'groovy':true]
  • 一个闭包对象,它在被调用时会调用 builder 中的两个 'person' 方法,这两个方法都有两个参数,一个存值的 Map 和一个闭包。(a Closure object which when invoked will call 2 methods on the builder called 'person', each taking 2 parameters, a map of values and a closure...)

像这样,我们可以用简洁的语句轻松地表示任意嵌套的标记。没有尖尖的括号!(smile)

而且这是 Groovy 内置的语法,所以你可以把标记语法混合到其它 Groovy 特性(如:迭代、分支、方法调用、参数、表达式等)中一起使用。例如:

Trees, DOMs, beans 和事件处理

GroovyMarkup 真的很简洁,因为它把标记语言映射为方法调用。这样它就可以轻松地支持任意对象结构的创建-所以它可以创建任意类似 DOM 的模型、bean 结构、JMX Mbeans、PicoComponents、Swing 前台、Ant 任务(Ant tasks)等等。更重要的是因为它只是一个标准的方法调用,所以它也可以自然地映射到 SAX 的事件处理。

Groovy 提供了很多现成的标记构建器(markup builder),可以直接使用:

  • NodeBuilder - 创建一个 Node 实例的树,在 Groovy 中可以通过似乎 XPath 的语法遍历它
  • DOMBuilder - 创建一个符合 W3C 语法的 DOM 文档
  • SAXBuilder - 触发 SAX 事件到给定的 SAX ContentHandler
  • MarkupBuilder - 输出 XML / HTML 标记到 PrintWriter 什么的,就像 servlet 实现或者代码生成器
  • AntBuilder - 为了处理 build 任务,使用熟悉的标记生成 Ant tasks
  • SwingBuilder - 使用简单的标记建立丰富的 Swing 用户界面

示例

这是一个简单的例子,展示如何使用 GroovyMarkup 遍历 SQL 结果集,并且将其输出为 XML 格式的文档。

值得关注的是上面代码中使用的 XML 技术,可以是基于推事件(push event)的(如 SAX)或者是拉事件(pull-event)的(如 StAX)或者 DOM 类 API(如 W3C, dom4j, JDOM, EXML, XOM)或者某种 JAXB 类(如 XMLBeans, Castor)的或只是个 bean,甚至是优秀而古老的文本文件。
例如拉解析器(pull parser)可以循环地将数据保存到数据库中,或者将数据保存到某种数据结构中,或使用 IO / 异步NIO 输出到文件。

使用 GroovyMarkup 可以隐藏 XML 的复杂性,这样开发者就可以集中精力处理真正要解决的问题。

在我们的单元测试用例(unit test case)中有更多使用 GroovyMarkup 的例子

更多细节参见 Make a builder

  • No labels