1、1 1u11.1 XML概述u11.2 XML语法u11.3 根标记与特殊字符u11.4 显示XML文档内容u11.5 用Servlet和JSP动态生成XML文档u习题11第11章 XML简介2 2XML是W3C发布的一种新的标准,它同HTML一样是SGML的一个简化子集。由于XML将SGML的丰富功能、可扩展性与HTML的易用性结合到了Web的应用中,自推出以来迅速得到软件开发商的支持和程序开发人员的喜爱,显示出了强大的生命力。本章主要介绍XML的基本概念和使用方法。3 3XML是eXtensible Markup Language的缩写,翻译成中文就是可扩展标记语言。XML是由W3C(Wo
2、rld Wide Web Consortium,万维网协会)于1998年2月发布的一种标准,它同HTML一样是SGML(Standard Generalized Markup Language,标准通用标记语言)的一个简化子集。在正式的XML规范1.0中将XML描述为:“可扩展标记语言(XML)是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务、接收和处理。”11.1 XML概述概述4 4所谓可扩展性是指XML允许用户按照XML规则自定义标记。XML文件是由标记及其所标记的内容构成的文本文件。与HTML不同的是,XML的标记可自由定义,其目的是使得XML文件能够很
3、好地体现数据的结构和含义。因此,XML被设计成易于实现,且可在SGML和HTML之间互相操作。5 5Web技术的发展,其丰富的信息资源给人们的学习和生活带来了极大的便利。由于HTML具有简单易学、灵活通用的特性,使人们在Internet上检索、发布、交流信息变得非常简单。然而,随着电子商务、远程教育等新兴的Web领域的全面兴起,传统的HTML由于自身特点的限制,逐渐暴露出下述问题。6 6(1)HTML作为一种简单的表示性语言,只能显示内容而无法表达数据内容的结构。例如:若用HTML标记描述“书名:面向对象程序设计Java;作者:张白一,崔尚森;出版社:西安电子科技大学出版社,出版时间:2006
4、年1月”之间的逻辑关系是不可能的。HTML标题标记只标记标题文本本身,例如 XML文档,因为没有在标题标记中嵌套一个属于文档部分的实际文本和标记,所以这些标记不能用来组成树型分层结构的文档,来体现数据之间的逻辑关系和继承关系。而这一点恰恰是电子商务、远程教育等所必需的。7 7(2)HTML缺乏描述矢量图形、算术公式、化学公式等特殊标记对象。(3)最重要的是HTML只是SGML的一个实例化的子集,它的可扩展性差,用户根本不能自定义有意义的标记供他人使用。这一切都成为Web技术进一步发展的障碍。8 8虽然SGML是一种通用的文档结构描述标记语言,为语法标记提供了异常强大的工具,同时具有极好的扩展性
5、,因此在数据分类和索引中非常有用。但SGML的复杂度太高,不适合网络的日常应用,加上开发成本高、不被主流浏览器所支持等原因,使得SGML在Web上的推广受到阻碍。在这种情况下,开发一种兼具SGML的强大功能、可扩展性以及HTML的简单性的语言势在必行,由此诞生了XML语言。9 9XML的主要设计目标是在Web上保存并传递信息。HTML是描述数据显示的语言,而XML是描述数据及其结构的语言。XML具有下述特点:(1)XML描述数据的结构性较强。XML文档具有类似树型的分层结构,XML文档只有单个根标记,它包含了所有其它标记。一个标记可以嵌套在另一个XML标记中,因此,可以很容易地使用XML定义分
6、层结构文档。(2)XML文档更便于阅读。由于XML文档是用纯文本编写的,而且具有类似树型的逻辑结构,所以人们很容易阅读,并且可以通过为文档标记、属性和实体选择有意义的名字,并且增加有用的注释来增强XML的可读性。10 10(3)XML文档具有开放式标准。众多公司支持W3C,改进的XML标准支持各式系统和浏览器上的开发人员和用户使用XML文档。XML解释器可以使用编程的方法来载入一个XML的文档,当这个文档被载入以后,用户就可以通过XML文件对象模型来获取和操纵整个文档的信息。11 11(4)XML文档具有国际化标准。XML依靠它的统一代码的新的编码标准,支持世界上所有主要以语言编写的混合文本。
7、在HTML中,就大多数字处理而言,一个文档一般是用一种特殊语言写成的,如果用户的软件不能阅读特殊语言的字符,那么他就不能使用该文档。但是能阅读XML语言的软件就能顺利处理这些不同语言文字。XML及相关技术规范符号的任意组合,使得XML不仅能在不同的计算机系统之间交换信息,而且能跨国界和超越不同文化疆界交换信息。12 12(5)XML高效且可扩充性强。它支持复用文档片断,使用者可以设计和使用自己的标签,也可与他人共享。在XML中可以定义许多标记。XML提供了独立的运用程序的方法来共享数据。13 13XML文件的扩展名必须为“.xml”。例如,“a.xml”、“b1.xml”都是合法的XML文件名
8、。编写XML文档,必须遵守XML规范中的语法规则。无论是从物理结构上讲,还是从逻辑结构上讲,XML都必须符合规范才能被正确解释处理。11.2 XML语法语法14 1411.2.1 XML文档结构文档结构XML文档的定义由框架语法组成。当编写一个XML文档时,可以创建自己的标记,并赋予任意的名称。这就是XML(Extensible Markup Language,可扩展标记语言)中术语“Extensible”的意义。例如,下面是一个描述书籍信息的XML文档。15 15【示例文档c11_1.xml】一个简单的XML文档。面向对象程序设计Java 张白一,崔尚森西安电子科技大学出版社26.00200
9、6年1月16 16JSP实用案例教程 冯燕奎,赵德奎 等清华大学出版社35.002004年5月17 17XML文档主要由序言和文档根标记两个主要部分组成。序言中包含XML声明、处理指令和注释。在文档根标记中可以嵌入多个标记。如果直接用IE浏览器打开XML文件,则显示成如图11.1所示的默认树型结构。18 18图11.1 c11.xml的运行结果19 1911.2.2 XML声明声明当开始着手写一个XML文件时,最好以一个“XML声明”作为开始。之所以说“最好”,是因为XML声明在文件中是可选内容,可加可不加,但W3C推荐加入这一行声明。因此,作为一个良好的习惯,我们通常把XML声明作为XML文
10、件的第一行。它的作用就是告诉XML处理器:“下面这个文件是按照XML文件的标准对数据进行标记的”。XML声明是以“”结束的。XML声明中可以包含下述三个属性。20201.version属性属性在一个XML的声明中必须包括version属性指明所采用的XML的版本号,而且,它必须在属性列表中排在第一位。由于当前的XML最新版本是1.0,所以我们看到的无一例外的都是version=1.0,我们在c11_1.xml中也设定 version=1.0。虽然在2002年10月15日以候选推荐标准(Candidate Recommendation)形式发表了XML1.1版本,但目前仍在征求意见之中。21 2
11、12.encoding属性属性该属性指定文档中使用的字符编码标准。我们常用的编码有:(1)GB2312或GBK:简体中文编码。(2)UTF-8:压缩的Unicode编码。(3)BIG5:繁体中文编码。如果没有声明encoding属性,那么该属性默认为UTF-8编码。保存XML文档时要注意。22223.standalone属性属性该属性可以取值“yes”或“no”,以说明XML文件是否和一个外部文档(独立的标记声明文件)配套使用。“yes”表示与外部文件无关联。232311.2.3 XML元素元素元素是XML文件内容的基本单元。从语法上讲,一个元素包含一个起始标记、一个结束标记以及标记之间的数据
12、内容。其使用形式如下:数据内容例如,在c11_1.xml文件中的一个元素是:面向对象程序设计Java元素中还可以再嵌套别的元素。例子c11_1.xml中的元素中就嵌套了元素,而元素中又嵌套了、等元素。其中元素包含了文件中所有的数据信息,称之为根元素。、等这些元素称为XML的标记。242411.2.4 XML元素基本语法规则元素基本语法规则(1)标记必不可少。任何一个形式良好的XML文件中至少要有一个元素。也就是说,标记在XML文件中是必不可少的。(2)区分大小写。在标记中必须注意区分大小写。在HTML中,标记和是一回事,但在XML中,它们是两个截然不同的标记。2525(3)要有正确的结束标记。
13、结束标记除了要和开始标记在拼写和大小写上完全相同之外,还必须在前面加上一个斜杠“/”。因此,如果开始标记是,则结束标记应该写作。(4)标记要严格配对。例如,HTML中的、等单边标记在XML中是不合法的。2626(5)空元素标记。空标记就是没有任何数据内容的元素。空元素的语法格式如下:或 或 例如:或 或 2727(6)非空元素就是有任何数据内容的元素。非空元素的语法格式如下:数据内容例如:面向对象程序设计Java(7)标记要正确嵌套。在一个XML元素中允许包含其它XML元素,但这些元素之间必须满足嵌套性。例如,下面这么写是错误的:JAVA编程入门2828(8)标记命名要合法。标记应该以字母、下
14、划线或冒号开头,后面跟字母、数字、句号、冒号、下划线或连字符,但是中间不能有空格,而且任何标记不能以“xml”起始。另外,最好不要在标记的开头使用冒号,尽管它是合法的,但可能会带来混淆。(9)有效使用属性。标记中可以包含任意多个属性。在标记中,属性以“名称=取值”的形式出现。名称与取值之间用等号“=”分隔,且取值要用引号引起来。属性名不能重复。292911.2.5 XML的注释的注释在XML中,注释是以“”结束的,这和HTML的注释完全相同。但是,仍然有以下几点需要注意:(1)在注释文本中不能出现字符“-”或字符串“-”,XML处理器可能把它们和注释结尾标志“-”相混淆。(2)不要把注释文本放
15、在标记之中。(3)注释不能嵌套。在使用一对注释符号表示注释文本时,要保证其中不再包含另一对注释符号。(4)注释文本只能出现在XML声明之后。3030标记(markup)是用来描述文档结构的定界文本即元素的起始标记、元素的结束标记、空元素标记、注释、文档类型声明、处理指令、CDATA段定界符、实体引用和字符引用等。标记指出了文档的逻辑结构,包含了文档的信息内容。11.3 根标记与特殊字符根标记与特殊字符31 3111.3.1 XML文档的根标记文档的根标记在XML文档中有且仅有一个根标记,其它标记都必须嵌套在根标记之内。在c11_1.xml文件中,根元素是目录,起始根标记是,结束根标记是,其内容
16、是两个嵌套的书元素。书元素的起始标记是,结束标记是。每个书元素中又嵌套五个元素,分别是:书名、作者、出版社、价格及出版日期。323211.3.2 数据内容中的特殊字符数据内容中的特殊字符元素是由标记和数据内容组成的,在XML中有五种特殊字符:左尖括号“”、与符号“&”、单引号“”、双引号“”。W3C制定的规范中规定:数据内容中不能含有特殊字符。要想使用这五种字符,可以通过实体引用。XML常用的实体引用如表11.1所示。3333表表11.1 XML常用的实体引用常用的实体引用3434注意:在XML中实体引用以“&”开始,以“;”结束。例如,若要输出“&”这样的内容,就要使用实体引用。在XML文档
17、中应该写成:1970年出生&<大学毕业>解释器解释出该元素的数据是:1970年出生&3535本节介绍XML文档的三种显示方式,分别是:没有样式表单的显示方式;使用CSS样式表单的显示方式;使用XSL样式表单的显示方式。11.4 显示显示XML文档内容文档内容363611.4.1 显示没有样式表的显示没有样式表的XML文档文档如果XML文件没有包含指向一个样式表的链接,当直接运行XML文件时,IE浏览器只显示如图11.1所示的整个文档的文本,并用不同的颜色来区分文档的不同组成部分,以便帮助我们理解文档的结构。在每个元素的起始标记的左边有一个“-”号或“+”号。“-”号表示该元
18、素的内容已全部展开;“+”号表示该元素的内容已收缩。单击起始标记左边的“-”号可以收缩元素,而单击已收缩元素旁边的“+”号可以展开它。例如,如果单击第一个元素旁边的“-”号,就会看到如图11.2所示的内容。用收缩和扩展树的形式显示文档元素,可以清楚地指出文档的逻辑结构,详细地查看各层。3737图11.2 c11_1.xml收缩元素运行结果383811.4.2 显示有显示有CSS样式表的样式表的XML文档文档CSS(层叠样式表)是一种样式表描述规则。样式表是用来定义Web页面格局的模板,通过样式表可以定义页面的标头、页边距、缩进、字体大小及各种背景颜色等,用以完成Web页面的风格设计。39391
19、.CSS样式的定义样式的定义样式的定义由一个标记的名称和定义这个标记的显示方式的属性列表组成。属性包括属性名和属性值,其间使用冒号分开,同时各种不同的属性以分号分开。属性的使用格式如下:4040标记名 属性名1:属性值1;属性名2:属性值2;属性名k:属性值k;例如,在下边的c11_2.css程序中,“font-size”、“font-weight”是属性名,“36pt”、“bold”是属性值。41 412.CSS样式的使用样式的使用为了让XML使用CSS样式,在XML文件中必须加入使用CSS样式的声明。使用这种声明的一般格式如下:例如:表示样式表单文件与当前的XML文件在同一个目录下;表示通
20、过链接的网址访问样式表单文件。42423.示例示例【示例文档c11_2.xml】调用c11_2.css的XML文件。1970年出生&<大学毕业>4343【示例文档c11_2.css】对c11_2.xml中的标记“张三”定义显示样式,定义的字体大小为36pt和字体加粗。张三 font-size:36pt;font-weight:bold;双击c11_2.xml文件,运行结果如图11.3所示。4444图11.3 c11_2.xml的运行结果454511.4.3 显示有显示有XSL样式表的样式表的XML文档文档CSS是一种静态的样式描述格式,其本身不遵从XML的语法规范。而XSL
21、(eXtensible Stylesheet Languge,可扩展样式语言)是遵从XML语法规范的XML的一种具体应用,它的功能比CSS强大得多。1.XML变换的基本步骤变换的基本步骤(1)在XML文件中加入使用XSL的声明。(2)在XSL文件中建立XML文件的样式表。(3)在XSL文件中将样式表转换成HTML文件。XML变换的基本步骤如图11.4所示。4646图11.4 XML变换的基本步骤4747下面用示例来说明。【示例文档c11_3.xml】一个简单的XML文档。面向对象程序设计Java 张白一,崔尚森【示例文档c11_3.xsl】显示c11_3.xml文件的XSL样式表。4848 运
22、行c11_3.xml文件,其结果如图11.5所示。4949XML变换的基本步骤是:当浏览器打开c11_3.xml文件时,浏览器内部的XSL处理器,首先进行XSL变换,将其中的XSL标记分别转换为面向对象程序设计Java 张白一,崔尚森得到一个如下的HTML文件:5050 面向对象程序设计Java 张白一,崔尚森 然后执行该HTML文件,显示如图11.5所示的结果。51 51图11.5 c11_3.xml的运行结果52522.XSL样式的使用样式的使用为了让XML使用XSL样式,在XML文件中必须加入如下形式的使用XSL样式的声明:例如:(1)样式表文件与XML文件在同一目录。(2)通过链接访问
23、样式表。53533.XSL样式表结构样式表结构XSL样式表结构与XML相似,主要由序言和根标记两个主要部分组成,序言中包含XSL声明、处理指令和注释。在根标记中嵌入根模板,根模板中可嵌入多个子模板。直接用IE浏览器打开XSL文件,显示成默认的树型结构。下面以文档c11-3.xsl为例说明其结构。5454(1)序言部分。程序中的序言部分为这里需要注意的是,样式表的编码必须与关联的XML有相同的编码。5555(2)根标记结构。程序中的根标记结构为根模板标记XSL样式表根标记的名称必须是“xsl:stylesheet”。“xmlns:xsl”指明的命名空间http:/www.w3.org/TR/WD
24、-xsl表示让浏览器的XSL处理器来实现XSL变换。5656(3)根模板标记。XSL处理器首先找到根模板,然后开始XSL变换。程序中的根模板结构为 根标记模板的内容这里需要注意的是,根模板的匹配模式必须是“/”。5757(4)程序中用到的XSL语句。程序中的XSL语句是XSL中的赋值语句,表示取出引号中指定的属性值,即取出书元素中书名的值(面向对象程序设计Java)。程序中用到的XSL语句如表11.2所示。5858表表11.2 程序中用到的程序中用到的XSL语句语句5959前面介绍的是编写静态XML页面的方法。静态的XML文档只能表示比较简单的信息,而无法完成比较复杂的客户端与服务器端的交互。
25、本节我们主要介绍动态生成XML文档的方法。包括用Servlet动态生成XML文档和用JSP动态生成XML文档。11.5 用用Servlet和和JSP动态生成动态生成XML文档文档606011.5.1 用用Servlet动态生成动态生成XML文档文档为了说明用Servlet动态生成XML文档的方法,我们编写下述三个文件:一是填写留言信息的HTML文件;二是获得留言信息并生成XML文件的Servlet程序;三是对XML文件标记附加不同的样式,生成HTML文件的XSL文件。61 611.填写留言信息的示例文档填写留言信息的示例文档c11_4_html.html message board 留言板 姓
26、名:6262 留言:6363 运行c11_4_html.html程序,填写留言信息,结果如图11.6所示。6464图11.6 c11_4_html的运行结果65652.获得留言信息,并生成获得留言信息,并生成XML文件的文件的Servlet示例程示例程序序C11_4_XSL_Servlet.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class C11_4_XSL_Servlet extends HttpServlet/重写doPost方法public void doPost(Ht
27、tpServletRequest req,HttpServletResponse res)throws ServletException,IOException6666/设置服务器输出格式为XML文档res.setContentType(text/xml);/获得与客户端的浏览器链接的输出流,用于发送输出结果ServletOutputStream out=res.getOutputStream();out.print();out.println();out.println();6767 out.println();out.println(req.getParameter(name);out.p
28、rintln();out.println();out.println(req.getParameter(content);out.println();out.println();out.close();6868/重写doGet方法public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOExceptiondoPost(req,res);69693.对对XML文件标记附加不同样式的文件标记附加不同样式的XSL示例文件示例文件c11_4.xsl 7070 C11_4_XSL_
29、Servlet的运行结果如图11.7所示。图11.8是XSL文件在Eclipse平台中的存放位置说明。71 71图11.7 C11_4_XSL_Servlet的运行结果7272 图11.8 c11_4.xsl的存放位置737311.5.2 用用JSP动态生成动态生成XML文档文档直接将XML内容在JSP中输出的JSP示例程序如下。【示例程序c11_5.jsp】生成XML文件的JSP示例程序。%out.println(+面向对象程序设计Java+7474 张白一,崔尚森+西安电子科技大学出版社+26.00+2006年1月+);%out.println(+JSP实用案例教程+冯燕奎,赵德奎 等+7
30、575 清华大学出版社+35.00+2004年5月+);%【示例文档c11_5.xsl】对XML文件附加不同样式的XSL示例文件。7676 书目录 书名作者出版社价格出版日期 7777 7878 c11_5.jsp的运行结果如图11.9所示。7979图11.9 c11_5.jsp的运行结果808011.5.3 使用使用DOM解析解析XML文件文件DOM(Document Object Model,文档对象模型)是提供XML和HTML文档编程接口的W3C规范。XML文档将数据组织为一棵树,DOM就是对这棵树对象的描述。DOM解析XML文件后,就用树的形式定义了XML文件在内存中的逻辑结构,XML
31、文件中的元素便转化为DOM树中的节点对象。81 81Sun公司推出的JDK1.4及以上版本中的Java API遵循了 DOM Level 2 Core推荐接口的语义说明,提供了相应的Java语言的实现。Java应用程序可以通过DOM API来访问XML数据。javax.xml.parsers包中提供的DoumentBuilder和DocumentBuilderFactory组合,可以对XML文件进行解析,转换成DOM树。org.xml.dom包中提供了Document、Node、NodeList、Element、Text等接口,可以创建、遍历、修改DOM树。javax.xml.transfor
32、m.dom和javax.xml.transform.stream包中提供了DOMSource类和StreamSource类,可以将更新后的DOM文档生成XML文件。8282为了解析XML文件,DOM规定了各种类型节点之间形成的如图11.10所示的子孙关系。Document节点代表了整个XML或HTML文档,提供了对文档元素和数据的访问。所有其它的节点都以一定的顺序包含在Document中,排成一个树型结构。它提供许多方法来获取该节点及节点的相关信息。8383图11.10 DOM树中节点间的关系8484Element元素表示一个XML或HTML元素。文档的数据包含在它的元素中。元素也可具有提供附
33、加内容信息的属性。它提供许多方法来获取该节点及节点的相关信息。Text节点表示的是元素或属性值的文本内容,对应着XML中的数据内容。CDATASection节点解决XML文档中的特殊字符的实体引用问题。DocumentType节点对应着XML文档所关联的DTD文件。8585下面通过示例来说明如何使用DOM解析XML文档。【示例文档c11_6.xml】一个简单的XML文档。面向对象程序设计Java 张白一,崔尚森 西安电子科技大学出版社 26.00 2006年1月8686 JSP实用案例教程 冯燕奎,赵德奎 等 清华大学出版社 35.00 2004年5月 如果用DOM来图形化地表示c11_6.x
34、ml文档,则如图11.11所示。8787图11.11 c11_6.xml的运行结果8888【示例程序c11_6.java】用DOM解析c11_6.xml文档的Java程序。import org.w3c.dom.*;/XML的DOM实现 import java.io.*;import javax.xml.parsers.*;/XML解析器接口 public class C11_6 public static void main(String args)try /获得一个XML文档的解析器8989 DocumentBuilderFactory factory=DocumentBuilderFact
35、ory.newInstance();/解析XML文档生成DOM文档的接口类,以便访问DOM DocumentBuilder builder=factory.newDocumentBuilder();/Document接口描述了对应于XML文档的文档树 Document document=builder.parse(new File(C11_6.xml);9090 /去掉XML文档中作为格式化内容的空白,/而映射在DOM树中的不必要的Text Node对象 document.normalize();Element root=document.getDocumentElement();/获得根元素
36、 String rootName=root.getNodeName();/得到根元素名91 91 System.out.print(XML文件根节点的名字:+rootName);/获得根元素的子节点列表 NodeList nodelist=root.getChildNodes();GetElement(nodelist);/用递归方法实现DOM文档的遍历 catch(Exception e)System.out.println(e);public static void GetElement(NodeList nodelist)9292 int size=nodelist.getLength(
37、);/得到子节点列表的个数 for(int i=0;isize;i+)Node cnode=nodelist.item(i);/获得子节点列表中的第i个节点/判断该节点是否是文本节点 if(cnode.getNodeType()=Node.TEXT_NODE)Text textNode=(Text)cnode;String content=textNode.getWholeText();/获得文本内容 System.out.print(content);9393 /判断该节点是否是元素节点 if(cnode.getNodeType()=Node.ELEMENT_NODE)Element ele
38、mentNode=(Element)cnode;String name=elementNode.getNodeName();/获得元素名字 System.out.print(name+:);9494/获得根元素的子节点列表 NodeList nodelist1=elementNode.getChildNodes();GetElement(nodelist1);/用递归方法实现DOM文档的遍历 图11.12是上面两个文件在Eclipse平台中的存放位置的说明(左窗口)和运行的结果(右下窗口)。9595图11.12 c11_6.java的运行结果969611.1 XML是一种什么语言?11.2 XML与HTML语言有何不同?11.3 XML元素的语法格式是什么?11.4 XML声明中包含哪些属性?11.5 XSL样式表结构由哪几部分组成?11.6 XSL的根模板结构是什么?习习 题题 11979711.7 设计并编写一个数据内容有特殊字符的XML文档,显示内容用XSL文档。11.8 设计并编写一个用Servlet动态生成的XML文档,显示内容用XSL文档。11.9 设计并编写一个用JSP动态生成的XML文档,显示内容用XSL文档。11.10 设计并编写一个使用DOM解释XML文档的程序。11.11 用DOM来图形化地表示习题11.10的XML文档。