Groovy 简化记法怎么用?

文章导读
Previous Quiz Next Groovy 提供了 MarkupBuilder,它使用一种简化的表示法或 DSL(Domain Specific Language,领域特定语言)来直观地创建 XML 结构。使用 MarkupBuilder,我们可以用简洁的方式定义
📋 目录
  1. 使用 MarkupBuilder 的简化表示法的关键特性
  2. 使用简化表示法创建简单 XML
  3. 使用简化记号创建复杂 XML
  4. 简化记号的优势
A A

Groovy - XML 的简化表示法



Previous
Quiz
Next

Groovy 提供了 MarkupBuilder,它使用一种简化的表示法或 DSL(Domain Specific Language,领域特定语言)来直观地创建 XML 结构。使用 MarkupBuilder,我们可以用简洁的方式定义 XML 结构,格式更清晰、更易读。

使用 MarkupBuilder 的简化表示法的关键特性

  • 基于 Closure 的结构 − 在 Groovy 中,我们使用嵌套的 closure 来表示 XML 元素,并可以使用嵌套的 closure 表示完整的 XML 层次结构。

  • 隐式元素创建 − closure 的名称自动成为 XML 元素的名称。

  • 定义属性 − 属性在 closure 中以命名参数的形式定义。

  • 文本元素 − closure 的最后一个字符串参数或最后一个表达式被视为 XML 元素的文本内容。

使用简化表示法创建简单 XML

例如,如果我们需要创建以下 XML

<employee age="30">
   <name>Alice</name>
   <department>Admin</department>
</employee>

现在使用 MarkupBuilder,我们可以用以下简化表示法创建上述 XML −

Example.groovy

import groovy.xml.MarkupBuilder

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)

xml.employee(age: 30) {
   name 'Alice'
   department 'Admin'
}

def generatedXml = writer.toString()
println generatedXml

输出

运行上述程序时,我们将得到以下结果。

<employee age='30'>
  <name>Alice</name>
  <department>Admin</department>
</employee>

解释

  • xml.employee(age: 30) {...} − 创建一个 employee 元素,其中 age: 30 定义了属性 age,其值为 30。closure {...} 表示 employee 节点的子元素。

  • name 'Alice' − 创建一个 <name> 元素,其文本内容为 Alice

  • department 'Admin' − 创建一个 <department> 元素,其文本内容为 Admin

使用简化记号创建复杂 XML

例如,如果我们需要创建 XML 来表示员工列表。

<employees>
   <employee age="30">
      <name>Alice</name>
      <department>Admin</department>
      <salary>10000<salary>
   </employee>
   <employee age="35">
      <name>Adam</name>
      <department>Finance</department>
      <salary>11000<salary>
   </employee>
   <employee age="32">
      <name>Bob</name>
      <department>Finance</department>
      <salary>11000<salary>
   </employee>
</employees>

现在使用 MarkupBuilder,我们可以使用以下简化记号创建上述 XML −

Example.groovy

import groovy.xml.MarkupBuilder

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)

xml.employees{
   employee(age: 30) {
      name 'Alice'
      department 'Admin'
	  salary 10000
   }
   employee(age: 35) {
      name 'Adam'
      department 'Finance'
	  salary 11000
   }
   employee(age: 32) {
      name 'Bob'
      department 'Finance'
	  salary 11000
   }
}

def generatedXml = writer.toString()
println generatedXml

输出

运行上述程序时,我们将得到以下结果。

<employees>
  <employee age='30'>
    <name>Alice</name>
    <department>Admin</department>
    <salary>10000</salary>
  </employee>
  <employee age='35'>
    <name>Adam</name>
    <department>Finance</department>
    <salary>11000</salary>
  </employee>
  <employee age='32'>
    <name>Bob</name>
    <department>Finance</department>
    <salary>11000</salary>
  </employee>
</employees>

简化记号的优势

  • 改进的可读性 − 使用 MarkupBuilder 的 Groovy 代码非常接近 XML 结构,使代码高度易懂且易于维护。

  • 简洁的代码 − 简化记号比传统的 XML API 简洁得多。

  • 自动类型处理 − Groovy 在设置属性/元素内容时,大多数情况下会自动处理类型转换。

  • 嵌套 − 嵌套的 Closures 无缝表示层次化的 XML 结构。