📜  Groovy-XML

📅  最后修改于: 2020-11-04 06:47:47             🧑  作者: Mango


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文件movie.xml来构造XML文件并随后读取该文件。

 

    
      War, Thriller 
      DVD 
      2003 
      PG 
      10 
      Talk about a US-Japan war 
    
    
    
      Anime, Science Fiction
      DVD 
      1989 
      R 
      8 
      A schientific fiction 
    
    
    
      Anime, Action 
      DVD 
      1986 
      PG 
      10 
      Vash the Stam pede! 
    
    
    
      Comedy 
      VHS 
      1987 
      PG 
      2 
      Viewable boredom  
    
    
 

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() -这是一个标记生成器,用于创建 的头XML标签。

  • movie(title:’Enemy Behind’) -这些伪方法使用此方法创建子标签,并使用该值创建标签。通过指定一个称为title的值,实际上表明需要为该元素创建一个属性。

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

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

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

 
    
      War, Thriller 
      DVD 
      2003 
      PG 
      10 
      Talk about a US-Japan war 
    

为了创建整个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]) 
            }
         }
      }
   } 
} 

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

 
    
      War, Thriller 
      DVD 
      2003 
      PG 
      PG 
      10 
    
    
      Anime, Science Fiction 
      DVD 
      1989
      R 
      R 
      8 
    
    
      Anime, Action 
      DVD 
      1986 
      PG 
      PG 
      10 
    
    
      Comedy 
      VHS 
      1987 
      PG 
      PG 
      2 
    
 

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文件的位置。

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

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