Groovy - XML



XML 是一种可移植的开源语言,允许程序员开发其他应用程序可以读取的应用程序,而不管操作系统和/或开发语言如何。这是用于在应用程序之间交换数据的最常用语言之一。

什么是 XML?

可扩展标记语言 XML 是一种标记语言,类似于 HTML 或 SGML。这是万维网联盟推荐的开放标准。XML 对于跟踪少量到中等数量的数据非常有用,而无需 SQL 数据库作为基础。

Groovy 中的 XML 支持

Groovy 语言也提供了丰富的 XML 语言支持。使用的两个最基本的 XML 类是:

  • XML 标记构建器 - Groovy 支持基于树的标记生成器 BuilderSupport,可以对其进行子类化以创建各种树状对象表示。通常,这些构建器用于表示 XML 标记、HTML 标记。Groovy 的标记生成器捕获对伪方法的调用,并将它们转换为树结构的元素或节点。这些伪方法的参数被视为节点的属性。作为方法调用一部分的闭包被视为生成的树节点的嵌套子内容。

  • XML 解析器 - Groovy XmlParser 类采用简单的模型将 XML 文档解析为 Node 实例的树。每个 Node 都有 XML 元素的名称、元素的属性以及对任何子 Node 的引用。此模型足以满足大多数简单的 XML 处理需求。

对于所有 XML 代码示例,让我们使用以下简单的 XML 文件 movies.xml 来构建 XML 文件并随后读取文件。

<collection shelf = "New Arrivals"> 

   <movie title = "Enemy Behind"> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
	
   <movie title = "Transformers"> 
      <type>Anime, Science Fiction</type>
      <format>DVD</format> 
      <year>1989</year> 
      <rating>R</rating> 
      <stars>8</stars> 
      <description>A schientific fiction</description> 
   </movie> 
	
   <movie title = "Trigun"> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Vash the Stam pede!</description> 
   </movie> 
	
   <movie title = "Ishtar"> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>2</stars> 
      <description>Viewable boredom </description> 
   </movie> 
	
</collection> 

XML 标记构建器

语法

public MarkupBuilder()

MarkupBuilder 用于构建整个 XML 文档。XML 文档是通过首先创建 XML 文档类的对象来创建的。创建对象后,可以调用伪方法来创建 XML 文档的各种元素。

让我们来看一个如何从上面的 XML 文档创建一个块(即一个 movie 元素)的示例:

import groovy.xml.MarkupBuilder 

class Example {
   static void main(String[] args) {
      def mB = new MarkupBuilder()
		
      // Compose the builder
      mB.collection(shelf : 'New Arrivals') {
         movie(title : 'Enemy Behind')
         type('War, Thriller')
         format('DVD')
         year('2003')
         rating('PG')
         stars(10)
         description('Talk about a US-Japan war') 
      }
   } 
}

在上面的示例中,需要注意以下几点:

  • mB.collection() - 这是一个标记生成器,它创建 `` 的头部 XML 标记。

  • movie(title : 'Enemy Behind') - 这些伪方法创建具有此方法创建标记值的子标记。通过指定名为 title 的值,这实际上表示需要为元素创建属性。

  • 向伪方法提供一个闭包以创建 XML 文档的其余元素。

  • 初始化 MarkupBuilder 类的默认构造函数,以便生成的 XML 输出到标准输出流。

运行上面的程序,我们将得到以下结果:

<collection shelf = 'New Arrivals'> 
   <movie title = 'Enemy Behind' /> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
</collection>

为了创建整个 XML 文档,需要执行以下操作:

  • 需要创建一个映射条目来存储元素的不同值。
  • 对于映射的每个元素,我们将值分配给每个元素。
import groovy.xml.MarkupBuilder 

class Example {
   static void main(String[] args) {
      def mp = [1 : ['Enemy Behind', 'War, Thriller','DVD','2003', 
         'PG', '10','Talk about a US-Japan war'],
         2 : ['Transformers','Anime, Science Fiction','DVD','1989', 
         'R', '8','A scientific fiction'],
         3 : ['Trigun','Anime, Action','DVD','1986', 
         'PG', '10','Vash the Stam pede'],
         4 : ['Ishtar','Comedy','VHS','1987', 'PG', 
         '2','Viewable boredom ']] 
			
      def mB = new MarkupBuilder()  
		
      // Compose the builder
      def MOVIEDB = mB.collection('shelf': 'New Arrivals') {
         mp.each {
            sd -> 
            mB.movie('title': sd.value[0]) {  
               type(sd.value[1])
               format(sd.value[2])
               year(sd.value[3]) 
               rating(sd.value[4])
               stars(sd.value[4]) 
               description(sd.value[5]) 
            }
         }
      }
   } 
} 

运行上面的程序,我们将得到以下结果:

<collection shelf = 'New Arrivals'> 
   <movie title = 'Enemy Behind'> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Transformers'> 
      <type>Anime, Science Fiction</type> 
      <format>DVD</format> 
      <year>1989</year>
	  <rating>R</rating> 
      <stars>R</stars> 
      <description>8</description> 
   </movie> 
   <movie title = 'Trigun'> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Ishtar'> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>2</description> 
   </movie> 
</collection> 

XML 解析

Groovy XmlParser 类采用简单的模型将 XML 文档解析为 Node 实例的树。每个 Node 都有 XML 元素的名称、元素的属性以及对任何子 Node 的引用。此模型足以满足大多数简单的 XML 处理需求。

语法

public XmlParser() 
   throws ParserConfigurationException, 
      SAXException

以下代码展示了如何使用 XML 解析器读取 XML 文档。

让我们假设我们有相同名为 Movies.xml 的文档,并且我们想要解析 XML 文档并向用户显示正确的输出。以下代码片段展示了我们如何遍历 XML 文档的整个内容并向用户显示正确的响应。

import groovy.xml.MarkupBuilder 
import groovy.util.*

class Example {

   static void main(String[] args) { 
	
      def parser = new XmlParser()
      def doc = parser.parse("D:\\Movies.xml");
		
      doc.movie.each{
         bk->
         print("Movie Name:")
         println "${bk['@title']}"
			
         print("Movie Type:")
         println "${bk.type[0].text()}"
			
         print("Movie Format:")
         println "${bk.format[0].text()}"
			
         print("Movie year:")
         println "${bk.year[0].text()}"
			
         print("Movie rating:")
         println "${bk.rating[0].text()}"
			
         print("Movie stars:")
         println "${bk.stars[0].text()}"
			
         print("Movie description:")
         println "${bk.description[0].text()}"
         println("*******************************")
      }
   }
} 

运行上面的程序,我们将得到以下结果:

Movie Name:Enemy Behind 
Movie Type:War, Thriller 
Movie Format:DVD 
Movie year:2003 
Movie rating:PG 
Movie stars:10 
Movie description:Talk about a US-Japan war 
******************************* 
Movie Name:Transformers 
Movie Type:Anime, Science Fiction 
Movie Format:DVD 
Movie year:1989 
Movie rating:R 
Movie stars:8 
Movie description:A schientific fiction 
******************************* 
Movie Name:Trigun 
Movie Type:Anime, Action
Movie Format:DVD 
Movie year:1986 
Movie rating:PG 
Movie stars:10 
Movie description:Vash the Stam pede! 
******************************* 
Movie Name:Ishtar 
Movie Type:Comedy 
Movie Format:VHS 
Movie year:1987 
Movie rating:PG 
Movie stars:2 
Movie description:Viewable boredom

关于上述代码需要注意的重要事项:

  • 正在形成 XmlParser 类的对象,以便它可以用于解析 XML 文档。

  • 解析器被赋予 XML 文件的位置。

  • 对于每个 movie 元素,我们使用闭包来浏览每个子节点并显示相关信息。

对于 movie 元素本身,我们使用 @ 符号来显示附加到 movie 元素的 title 属性。

广告