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 文件 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 
    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> 
    
  • 解析

    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 文件的位置。
    • 对于每个电影元素,我们使用一个闭包来浏览每个子节点并显示相关信息。
    对于 movie 元素本身,我们使用 @ 符号来显示附加到 movie 元素的 title 属性。