XML是一种便携的开放源代码语言,允许程序员开发可以被其他应用程序读取的应用程序,而不管操作系统和/或开发语言。这是用于在应用程序之间交换数据的最常用的语言之一。
可扩展标记语言XML是一种非常类似于HTML或SGML的标记语言。这是万维网联盟推荐的,可作为开放标准。XML对于跟踪少量到中等数据量而不需要基于SQL的骨干非常有用。
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>
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文件的位置。
对于每个电影元素,我们使用闭包浏览每个子节点并显示相关信息。
对于movie元素本身,我们使用@符号显示附加到movie元素的title属性。