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 实例树。 每个节点都有 XML 元素的名称、元素的属性以及对任何子节点的引用。 这个模型对于大多数简单的 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 文档中创建一个电影元素 −

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 元素本身,我们使用@ 符号来显示附加到电影元素的标题属性。