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文档,这个文档存放的是“租车系统”车辆信息。

  1. <?xml version = "1.0" encoding="UTF-8"?>
  2. <!DOCTYPE vehicles SYSTEM "zcxt.dtd">
  3. <vehicles>
  4. <cars>
  5. <car id="1">
  6. <name>战神</name>
  7. <oil>20</oil>
  8. <loss>0</loss>
  9. <brand>长城</brand>
  10. </car>
  11. <car id="2">
  12. <name>跑得快</name>
  13. <oil>40</oil>
  14. <loss>20</loss>
  15. <brand>红旗</brand>
  16. </car>
  17. </cars>
  18. <trucks>
  19. <truck id="3">
  20. <name>大力士</name>
  21. <oil>20</oil>
  22. <loss>0</loss>
  23. <load>5吨</load>
  24. </truck>
  25. <truck id="4">
  26. <name>大力士二代</name>
  27. <oil>30</oil>
  28. <loss>30</loss>
  29. <load>10吨</load>
  30. </truck>
  31. </trucks>
  32. </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文档中,具体内容如下:

  1. <?xml version = "1.0" encoding="UTF-8"?>
  2. <!DOCTYPE vehicles [
  3. <!ELEMENT vehicles (cars,trucks)>
  4. <!ELEMENT cars (car*)>
  5. <!ELEMENT trucks (truck+)>
  6. <!ELEMENT car (name,oil,loss,brand)>
  7. <!ATTLIST car id CDATA #REQUIRED>
  8. <!ELEMENT truck (name,oil,loss,load)>
  9. <!ATTLIST truck id CDATA #REQUIRED>
  10. <!ELEMENT name (#PCDATA)>
  11. <!ELEMENT oil (#PCDATA)>
  12. <!ELEMENT loss (#PCDATA)>
  13. <!ELEMENT brand (#PCDATA)>
  14. <!ELEMENT load (#PCDATA)>
  15. ]>
  16. <vehicles>
  17. <cars>
  18. <car id="1">
  19. <name>战神</name>
  20. <oil>20</oil>
  21. <loss>0</loss>
  22. <brand>长城</brand>
  23. </car>
  24. <!--省略部分元素内容-->
  25. </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的内容如下:

  1. <!ELEMENT vehicles (cars,trucks)>
  2. <!ELEMENT cars (car*)>
  3. <!ELEMENT trucks (truck+)>
  4. <!ELEMENT car (name,oil,loss,brand)>
  5. <!ATTLIST car id CDATA #REQUIRED>
  6. <!ELEMENT truck (name,oil,loss,load?)>
  7. <!ATTLIST truck id CDATA #REQUIRED>
  8. <!ELEMENT name (#PCDATA)>
  9. <!ELEMENT oil (#PCDATA)>
  10. <!ELEMENT loss (#PCDATA)>
  11. <!ELEMENT brand (#PCDATA)>
  12. <!ELEMENT load (#PCDATA)>