Groovy-XML


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

什么是XML?

可扩展标记语言 XML 是一种与 HTML 或 SGML 非常相似的标记语言。这是由万维网联盟推荐并作为开放标准提供的。XML 对于跟踪中小型数据量非常有用,无需基于 SQL 的主干。

Groovy 中的 XML 支持

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

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

  • XML Parser - Groovy XmlParser 类采用一个简单的模型将 XML 文档解析为 Node 实例树。每个节点都有 XML 元素的名称、元素的属性以及对任何子节点的引用。该模型对于大多数简单的 XML 处理来说已经足够了。

对于我们所有的 XML 代码示例,我们使用以下简单的 XML 文件 movie.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 

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() - 这是一个标记生成器,用于创建 <collection></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 实例树。每个节点都有 XML 元素的名称、元素的属性以及对任何子节点的引用。该模型对于大多数简单的 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 文件的位置。

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

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