4.8 XML概述
XML是可扩展标记语言(eXtensible Markup Language)的简称。XML一经推出,就得到了IT行业巨头们的响应,如今已被广泛使用。XML独立于计算机平台、操作系统和编程语言用来表示数据,简单、灵活、交互性好和可扩展这几个特点是其能被广泛使用的主要原因。
4.8.1 XML应用范围
XML的应用范围主要体现在以下几个方面。
- 存储数据
&emsp ;内存中数据需要存储到文件中,才能在关闭系统或系统掉电之后,通过文件进行恢复。现如今,用数据库存储数据这种方式使用的最为广泛。因为数据库管理系统不仅能存储数据,而且提供了众多的管理数据的功能,尤其对大数据量的操作,通常都使用数据库。XML 与数据库相比,最大的优势就是简单、通用。
- 系统配置
&emsp ;如今,许多系统的配置文件都使用XML文档。使用XML文档进行系统配置,配置修改时不需要重新编译,灵活性强。例如接下来要学习的Servlet,需要在web.xml文件中进行配置。Struts 2.0的配置文件是struts.xml,Hibernate的主配置文件是hibernate.cfg.xml,Spring的默认配置文件是applicationContext.xml。
- 数据交换
&emsp ;在各个分散的应用系统里,因为其平台、系统、数据库、编程语言的差异,保存起来的数据往往只能被本系统调用,形成一个个信息孤岛。如果需要整合各个系统的数据信息,或者在两个或多个系统中进行数据交换,往往让IT人员非常烦躁。现在利用XML交互性好的特点,可以将各个信息孤岛的数据转换成标准的XML文件,通过这个标准的XML文件进行导入和导出,以达到交换数据的目的。
4.8.2 XML文档结构
接下来先看一个XML文档,这个文档存放的是“租车系统”车辆信息。
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE vehicles SYSTEM "zcxt.dtd">
<vehicles>
<cars>
<car id="1">
<name>战神</name>
<oil>20</oil>
<loss>0</loss>
<brand>长城</brand>
</car>
<car id="2">
<name>跑得快</name>
<oil>40</oil>
<loss>20</loss>
<brand>红旗</brand>
</car>
</cars>
<trucks>
<truck id="3">
<name>大力士</name>
<oil>20</oil>
<loss>0</loss>
<load>5吨</load>
</truck>
<truck id="4">
<name>大力士二代</name>
<oil>30</oil>
<loss>30</loss>
<load>10吨</load>
</truck>
</trucks>
</vehicles>
通过这个文档可以看出,XML文档的标签(例如vehicles、trucks、car、name等)可以是自定义的,具有可扩展性,这和之后将要学的HTML的标签是固定的不同。另外,HTML的主要作用是通过标签和属性,更好地显示数据,而XML是用来存储或交换数据用的,不记录数据的表现形式。
XML文档总是以XML声明开始,即告知处理程序,本文档是一个XML文档。在XML声明中,通常包括版本、编码等信息,以\“<?”开始,以“?>”结尾。
XML文档由元素组成,一个元素由一对标签来定义,包括开始和结束标签,以及其中的内容。元素之间可以嵌套(但不能交叉),也就是说元素的内容里还可以包含元素。
标签可以有属性(属性值要加引号),例如car标签和truck标签都有id这个属性。属性是对标签的进一步描述和说明,一个标签可以有多个属性,每个属性都有自己的名字和数值,属性是标签的一部分。
4.8.3 DTD文档类型定义
XML文档的优点之一就是它的灵活性,用户可以自定义标签和属性,满足用户存储数据的需求。XML另外一个特点就是交互性好,可以进行数据交换,但如果XML文档的编写人员随心所欲地编写XML文档,那么进行数据交换就无从谈起。为了更好地编写XML文档,保证文档格式的正确性,验证文档是否符合要求,可以使用DTD(Document Type Definition)对XML文档进行约束。
DTD用来定义XML文档中的元素、属性,元素之间的关系以及元素所能包含内容的类型。
通过DTD,每个XML文档均可携带一个有关其自身格式的描述。独立的团体可一致使用某个标准的DTD来规范XML文档,从而实现交换数据,而应用程序也可使用某个标准的DTD来验证从外部接收到的数据是否正确。
DTD可以定义在XML文档中,其作用域仅限于本文档,也可以作为一个外部文件存在,这个DTD文档可以被多个XML共用。例如刚才编写的XML文档,就是引用了外部的DTD文档zcxt.dtd进行的约束。下面是将DTD内容写在XML文档中,具体内容如下:
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE vehicles [
<!ELEMENT vehicles (cars,trucks)>
<!ELEMENT cars (car*)>
<!ELEMENT trucks (truck+)>
<!ELEMENT car (name,oil,loss,brand)>
<!ATTLIST car id CDATA #REQUIRED>
<!ELEMENT truck (name,oil,loss,load)>
<!ATTLIST truck id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT oil (#PCDATA)>
<!ELEMENT loss (#PCDATA)>
<!ELEMENT brand (#PCDATA)>
<!ELEMENT load (#PCDATA)>
]>
<vehicles>
<cars>
<car id="1">
<name>战神</name>
<oil>20</oil>
<loss>0</loss>
<brand>长城</brand>
</car>
<!--省略部分元素内容-->
</vehicles>
下面选出部分DTD行进行解释:
<!DOCTYPE vehicles [,根元素是vehicles。
<!ELEMENT vehicles (cars,trucks)>,vehicles包括cars和trucks子元素,顺序固定,只能出现一次。
<!ELEMENT cars (car)>,cars包括car子元素,表示car可以出现0-N次。
<!ELEMENT trucks (truck+)> ,trucks包括truck子元素,+表示truck至少出现1次。
<!ELEMENT car (name,oil,loss,brand)>,car包括name、oil、loss、brand子元素。
<!ATTLIST car id CDATA #REQUIRED>,car元素有id属性,是CDATA类型,必须出现。
<!ELEMENT truck (name,oil,loss,load?)>,truck包括name、oil、loss、load子元素,?表示可以出现0或1次。
<!ELEMENT name (#PCDATA)>,name元素是PCDATA类型。
如果引用的是外部的DTD文档zcxt.dtd进行的约束,则该zcxt.dtd的内容如下:
<!ELEMENT vehicles (cars,trucks)>
<!ELEMENT cars (car*)>
<!ELEMENT trucks (truck+)>
<!ELEMENT car (name,oil,loss,brand)>
<!ATTLIST car id CDATA #REQUIRED>
<!ELEMENT truck (name,oil,loss,load?)>
<!ATTLIST truck id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT oil (#PCDATA)>
<!ELEMENT loss (#PCDATA)>
<!ELEMENT brand (#PCDATA)>
<!ELEMENT load (#PCDATA)>