XML

优质
小牛编辑
124浏览
2023-12-01

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

XML是什么 (What is XML?)/h2>

可扩展标记语言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文件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标记生成器

语法 (Syntax)

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处理。

语法 (Syntax)

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元素的title属性。