📅  最后修改于: 2020-11-04 06:47:47             🧑  作者: Mango
XML是一种可移植的开放源语言,它使程序员能够开发可由其他应用程序读取的应用程序,而与操作系统和/或开发语言无关。这是用于在应用程序之间交换数据的最常见的语言之一。
可扩展标记语言XML是一种类似于HTML或SGML的标记语言。万维网联盟建议这样做,并且可以作为开放标准使用。 XML对于跟踪少量到中等的数据而不需要基于SQL的主干非常有用。
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
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() -这是一个标记生成器,用于创建
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
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属性。