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 使用简单的具有自我描述性的语法:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config . . .>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码。
第二行是文档类型定义(Document Type Definition, DTD)。
第三行描述文档的根元素(像在说:“本文档是一个便签”)。
接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body)。
最后一行定义根元素的结尾。
从本例可以设想,该 XML 文档包含了 John 给 George 的一张便签。
XML 文档必须包含根元素。该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。所有元素均可拥有子元素。父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。所有元素均可拥有文本内容和属性(类似 HTML 中)。
上图表示下面的 XML 中的一个book元素:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
例子中的根元素是 <bookstore>
。文档中的所有 <book>
元素都被包含在 <bookstore>
中。<book>
元素有 4 个子元素:<title>
、< author>
、<year>
、<price>
。
3. XML语法
所有 XML 元素都须有关闭标签。声明不属于XML本身的组成部分。它不是 XML 元素,也不需要关闭标签。打开标签和关闭标签通常被称为开始标签和结束标签。
XML 标签对大小写敏感。
XML 必须正确地嵌套。
<i>
元素在<b>
元素内打开,那么它必须在<b>
元素内关闭。XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。
XML 的属性值须加引号,就像这个categoty属性一样:
<book category="COOKING">
。除此之外,所有属性名都必须有属性值。实体引用。把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。为了避免这个错误,请用实体引用来代替 “<” 字符,在 XML 中,有 5 个预定义的实体引用。也可以在 DTD 中自定义其它的实体引用。 | < | < 小于 | | —- | —- | | > | > 大于 | | & | & 和号 | | ' | ‘ 单引号 | | " | “ 引号 |
XML 中的注释:
<!-- This is a comment -->
。注释中不能不能包含字符串--
。在 XML 中,所有空格都会被保留
XML 以 LF 存储换行。在 Windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符 (LF)。这对字符与打字机设置新行的动作有相似之处。在 Unix 应用程序中,新行以 LF 字符存储。而 Macintosh 应用程序使用 CR 来存储新行。
其他标记:
字符引用:
&#十进制数;
或&#x十六进制数;
如:é
可以用这两种形式表示:é
或é
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 "Shotgun" Ziegler">
因使用属性而引起的一些问题:
- 属性无法包含多重的值(元素可以)
- 属性无法描述树结构(元素可以)
- 属性不易扩展(为未来的变化)
- 属性难以阅读和维护
没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用子元素。在 XML 中,您应该尽量避免使用属性。请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
同一条信息,可以写成这样:
<note date="08/08/2008">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
也可以写成这样(更好):
<note>
<date>
<day>08</day>
<month>08</month>
<year>2008</year>
</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
针对元数据的 XML 属性:
有时会向元素分配 ID 引用。这些 ID 索引可用于标识 XML 元素,它的作用方式与 HTML 中 ID 属性是一样的。下面的例子演示了这种情况:
<messages>
<note id="501">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<note id="502">
<to>John</to>
<from>George</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>
上面的 ID 仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分。
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
3.3 规约
合法的 XML 文档除了要遵守前面介绍过的 XML 语法规则,还要遵守文档类型定义 (DTD) 的语法规则。在 XML 文档的声明的下一行,加上:<!DOCTYPE note SYSTEM "Note.dtd">
DOCTYPE 声明是对外部 DTD 文件的引用,下面列出了这个文件的内容。
DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
W3C 还支持一种基于 XML 的 DTD 代替者,名为 XML Schema。