1. 什么是XML

XML 指可扩展标记语言(EXtensible Markup Language)。XML 是一种标记语言,很类似 HTML,但XML 的设计宗旨是传输数据,而非显示数据,XML 被设计为具有自我描述性。XML 是 W3C 的推荐标准。
XML 不是 HTML 的替代,XML 和 HTML 为不同的目的而设计。XML 与 HTML 的主要差异:

  • XML 被设计为传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。
  • HTML 旨在显示信息,而 XML 旨在传输信息。

XML 是没有行为的。XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。我们需要编写软件或者程序,才能传送、接收和显示出这些信息。

XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。
在 HTML 中使用的标签(以及 HTML 的结构)是预定义的。HTML 文档只使用在 HTML 标准中定义过的标签(比如

等等)。XML 没有预定义的标签,它允许创作者定义自己的标签和自己的文档结构。

XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。

2. XML树结构

XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。
下面是一个一个 XML 文档实例,XML 使用简单的具有自我描述性的语法:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE config . . .>
  3. <note>
  4. <to>George</to>
  5. <from>John</from>
  6. <heading>Reminder</heading>
  7. <body>Don't forget the meeting!</body>
  8. </note>

第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码。
第二行是文档类型定义(Document Type Definition, DTD)。
第三行描述文档的根元素(像在说:“本文档是一个便签”)。
接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body)。
最后一行定义根元素的结尾。
从本例可以设想,该 XML 文档包含了 John 给 George 的一张便签。

XML 文档必须包含根元素。该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。所有元素均可拥有子元素。父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。所有元素均可拥有文本内容和属性(类似 HTML 中)。

XML -- 概念 - 图1
上图表示下面的 XML 中的一个book元素:

  1. <bookstore>
  2. <book category="COOKING">
  3. <title lang="en">Everyday Italian</title>
  4. <author>Giada De Laurentiis</author>
  5. <year>2005</year>
  6. <price>30.00</price>
  7. </book>
  8. <book category="CHILDREN">
  9. <title lang="en">Harry Potter</title>
  10. <author>J K. Rowling</author>
  11. <year>2005</year>
  12. <price>29.99</price>
  13. </book>
  14. <book category="WEB">
  15. <title lang="en">Learning XML</title>
  16. <author>Erik T. Ray</author>
  17. <year>2003</year>
  18. <price>39.95</price>
  19. </book>
  20. </bookstore>

例子中的根元素是 <bookstore>。文档中的所有 <book> 元素都被包含在 <bookstore> 中。
<book> 元素有 4 个子元素:<title>< author><year><price>

3. XML语法

  1. 所有 XML 元素都须有关闭标签。声明不属于XML本身的组成部分。它不是 XML 元素,也不需要关闭标签。打开标签和关闭标签通常被称为开始标签和结束标签。

  2. XML 标签对大小写敏感。

  3. XML 必须正确地嵌套。<i> 元素在 <b> 元素内打开,那么它必须在 <b> 元素内关闭。

  4. XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。

  5. XML 的属性值须加引号,就像这个categoty属性一样:<book category="COOKING">。除此之外,所有属性名都必须有属性值。

  6. 实体引用。把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。为了避免这个错误,请用实体引用来代替 “<” 字符,在 XML 中,有 5 个预定义的实体引用。也可以在 DTD 中自定义其它的实体引用。 | < | < 小于 | | —- | —- | | > | > 大于 | | & | & 和号 | | ' | ‘ 单引号 | | " | “ 引号 |

  7. XML 中的注释:<!-- This is a comment -->。注释中不能不能包含字符串 --

  8. 在 XML 中,所有空格都会被保留

  9. XML 以 LF 存储换行。在 Windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符 (LF)。这对字符与打字机设置新行的动作有相似之处。在 Unix 应用程序中,新行以 LF 字符存储。而 Macintosh 应用程序使用 CR 来存储新行。

  10. 其他标记:

    • 字符引用:&#十进制数;&#x十六进制数; 如:é 可以用这两种形式表示:&#233;&#xE9;

    • CDATA section:用 <![CDATA[]]> 来限定其界限。他们是字符数据的一种特殊形式,其中的文本会被解析器忽略。可以用它们来囊括那些含有 < > & 之类的字符串:<![CDATA[<&> are my faorite delimeters]]>

    • 处理指令:由 <??> 来限定其界限。在处理 XML 文档的程序中使用的指令。每个 XML 文档都以一个处理指令开头。

3.1 元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。XML 元素必须遵循以下命名规则:

  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字符 “xml”(或者 XML、Xml)开始
  • 名称不能包含空格

除此之外可使用任何名称。
最佳命名习惯

  • 使名称具有描述性。使用下划线的名称也很不错。
  • 名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>
  • 避免 “-“ 字符。如果您按照这样的方式进行命名:”first-name”,一些软件会认为你需要提取第一个单词。
  • 避免 “.” 字符。如果您按照这样的方式进行命名:”first.name”,一些软件会认为 “name” 是对象 “first” 的属性。
  • 避免 “:” 字符。冒号会被转换为命名空间来使用(稍后介绍)。
  • XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。
  • 非英语的字母比如 éòá 也是合法的 XML 元素名,不过需要留意当软件开发商不支持这些字符时可能出现的问题。

3.2 属性

XML 元素可以在开始标签中包含属性 (Attribute) ,类似 HTML。
属性提供关于元素的额外(附加)信息。属性通常提供不属于数据组成部分的信息。

属性值必须被引号包围,单引号和双引号均可使用。如果属性值本身包含双引号,那么有必要使用单引号包围它,就像这个例子:
<gangster name='George "Shotgun" Ziegler'>
或者可以使用实体引用:
<gangster name="George &quot;Shotgun&quot; Ziegler">

因使用属性而引起的一些问题:

  • 属性无法包含多重的值(元素可以)
  • 属性无法描述树结构(元素可以)
  • 属性不易扩展(为未来的变化)
  • 属性难以阅读和维护

没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用子元素。在 XML 中,您应该尽量避免使用属性。请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息
同一条信息,可以写成这样:

  1. <note date="08/08/2008">
  2. <to>George</to>
  3. <from>John</from>
  4. <heading>Reminder</heading>
  5. <body>Don't forget the meeting!</body>
  6. </note>

也可以写成这样(更好):

  1. <note>
  2. <date>
  3. <day>08</day>
  4. <month>08</month>
  5. <year>2008</year>
  6. </date>
  7. <to>George</to>
  8. <from>John</from>
  9. <heading>Reminder</heading>
  10. <body>Don't forget the meeting!</body>
  11. </note>

针对元数据的 XML 属性:
有时会向元素分配 ID 引用。这些 ID 索引可用于标识 XML 元素,它的作用方式与 HTML 中 ID 属性是一样的。下面的例子演示了这种情况:

  1. <messages>
  2. <note id="501">
  3. <to>George</to>
  4. <from>John</from>
  5. <heading>Reminder</heading>
  6. <body>Don't forget the meeting!</body>
  7. </note>
  8. <note id="502">
  9. <to>John</to>
  10. <from>George</from>
  11. <heading>Re: Reminder</heading>
  12. <body>I will not</body>
  13. </note>
  14. </messages>

上面的 ID 仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分。
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

3.3 规约

合法的 XML 文档除了要遵守前面介绍过的 XML 语法规则,还要遵守文档类型定义 (DTD) 的语法规则。在 XML 文档的声明的下一行,加上:
<!DOCTYPE note SYSTEM "Note.dtd">
DOCTYPE 声明是对外部 DTD 文件的引用,下面列出了这个文件的内容。
DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

  1. <!DOCTYPE note [
  2. <!ELEMENT note (to,from,heading,body)>
  3. <!ELEMENT to (#PCDATA)>
  4. <!ELEMENT from (#PCDATA)>
  5. <!ELEMENT heading (#PCDATA)>
  6. <!ELEMENT body (#PCDATA)>
  7. ]>

W3C 还支持一种基于 XML 的 DTD 代替者,名为 XML Schema。