XML - 可扩展标记语言 (Extensible Markup Language)
XML 是英文 Extensible Markup Language 的缩写,它的中文意思是 "可扩展标记语言"。
编写和浏览一个 XML 文档
XML 文档以 .xml 为后缀。
编写一个 XML 文档,不需要特别的软件,只需要一个文本编辑器就可以,比如记事本程序 (Notepad)。
你可以打开 Notepad,然后将下面这段代码拷贝下来,然后存成以 .xml 为后缀的文件,比如 book.xml,然后存盘,这样就生成了一个 XML 文档。
<?xml version="1.0" encoding="UTF-8"?>
<books ISBN ="9787544238212">
<title>The Book Thief</title>
<price>25</price>
<quantity>10</quantity>
</books>
你可以使用文本编辑器(如 Notepad或 EditPlus),浏览器 (如IE 或者 Firefox),或者 XML专用工具 (如XMLSpy) 打开并浏览 XML 文件。
我们可以通过这个 XML 文档的例子对 XML 有个初步的认识。
该 XML 文档的第一行是 XML 声明,定义了 XML 的版本和使用的字符编码。在这个例子中,XML 遵守的版本是 1.0,使用的字符编码是 UTF-8 字符集。
该 XML 文档有一个根元素 (root element) 叫做 books,books 根元素下又有 3 个元素,分别是 title, price, quantity。
每个 XML 元素都以一个起始标记 (opening tag) 开始 ,以一个结束标记 (closing tag) 收尾。
比如 <title> 就是一个起始标记,</title> 就是一个结束标记。
起始标记以 < 开始,以 > 结束。结束标记以 </ 开始,以 > 结束。
XML 元素可以带有属性,属性值要加引号。比如 ISBN 就是 books 的属性,属性值为 9787544238212。
XML 的标记 (tag) 是可以自定义的,用来描述数据。比如该例子中的 title 元素,
<title>The Book Thief</title>
title 标记表示这个元素内的数据是书名,The Book Thief 就是一个具体书名。
你可以修改标记,比如写成
<booktitle>The Book Thief</booktitle>
由于 XML 的标记可以随意定义,我们可以用 XML 描述和存储各种内容的数据。这里举的只是一个有关书的 XML 文档例子,你还可以创建其它 XML 文档,比如有关电影的,或者家具的,等等。也就是说,各种内容的数据,都可以通过 XML 描述和存储起来。
XML 文档是一棵节点树。一个XML 文档只有一个根节点。在该例子中,books 就是根节点,books 下面有子节点 title, price, quantity。
什么是 XML?
根据上面的例子,我们对 XML 有个大致的了解。总的来说,有以下几个要点:
· XML 是一种可扩展的标记语言 (Extensible Markup Language)。
· XML 的标记 (tag) 没有被预定义,用户可以自行定义标记来描述数据。
· XML 主要用来描述和存储数据。
· XML 具有自我描述性。
· XML 是树状结构的文档,是个结构化的文档。
· XML 文档是个文本文件。
使用 XML 的好处
· 易携带和传输
XML 文档不依赖于特殊的软件,只要有个文本编辑器,就可以编写 XML 文档,而且是存成文本格式。一个 XML 文档就是一个小小的文本文件,易于携带和传输。
· 易于共享和跨平台
XML 本身是个文本文件,而且是有结构化的数据,很容易被各系统读取。
· 易于查询
因为 XML 是树状结构,易于查询。
编写 XML 必须遵循一些简单的语法规则,主要列示如下:
· 每个开始标记 (opening tag) 必须有结束标记 (closing tag)
· 一个 XML 文档只能有一个根元素 (root element)
· 所有 XML 元素必须正确嵌套
· 属性值必须加引号
· 一个元素不能有相同的属性 (attribute)
XML 标记 (tag),元素 (element) 和属性 (attribute)
在解释上面的语法规则之前,我们先解释一些 XML 最常用的术语:
· 标记 (开始标记 opening tag,结束标记 closing tag)
· 元素 (element)
· 属性 (attribute)
<books ISBN ="9787544238212">
<title>The book thief</title>
<price>25</price>
<quantity>10</quantity>
</books>
上面是一个简单的 XML 文档,我们看到有很多这样的相同特征的字符串,<title>,<price>,<quantity>,</books> 等等。
它们都是由小于号 < 开始,由大于号 > 结束,在 XML 文档里,我们将其称为 XML 标记 (tag)。
标记又有开始标记和结束标记之分。
开始标记由 < 开始,由 > 结束。比如<title>,<price>,<quantity>。
结束标记由 </ 开始,由 > 结束。比如</title>,</price>,</quantity>。
而 XML 元素 (element) 指的是从一个开始标记到它的结束标记的一段内容。
比如 <title>The book thief</title> 就是一个元素。
元素是 XML 文档的基本单位,一个 XML 文档可以由一个或者多个元素构成。
一个元素可以带有属性 (attribute),属性写在开始标记里,写在元素名称的后面。比如
<books ISBN ="9787544238212">
其中 ISBN ="9787544238212" 就是 books 元素的一个属性, ISBN 是属性的名称,9787544238212 是属性值,属性值必须加引号。
XML 的语法规则
接下来,我们逐个解释 XML 文档的语法规则。
每个开始标记 (opening tag) 必须有结束标记 (closing tag)
比如上面的例子中, 开始标记 <price> 必须有相应的结束标记 </price>。
一个 XML 文档只能有一个根元素 (root element)
XML 文档是树状结构的,象一棵节点树。比如上面例子中,books 就是根元素,而 title,price,quantity 则是 books 的子节点。
如果写成下面这样,一个文档有两个 books 根元素,就出错了。
<?xml version="1.0" encoding="UTF-8"?>
<books ISBN ="9787544238212">
<title>偷书贼</title>
<price>25</price>
<quantity>10</quantity>
</books>
<books ISBN ="978758225">
<title>香水</title>
<price>100</price>
<quantity>12</quantity>
</books>
所有 XML 元素必须正确嵌套
正确的嵌套:
<books><title>香水</title></books>
错误的嵌套:
<books><title>香水</books></title>
属性值必须加引号
一个 XML 元素可以带有属性 (attribute),属性写在开始标记里,写在元素名称的后面。比如
<books ISBN ="9787544238212">
其中 ISBN ="9787544238212" 就是 books 元素的一个属性, ISBN 是属性的名称,9787544238212 是属性值,属性值必须加引号。
一个元素不能有相同的属性 (attribute)
下面的写法是错误的,因为一个 XML 元素不能有两个相同的属性名称,虽然属性值不同。
<books ISBN ="9787544238212" ISBN ="97875442dr">
不过,如果你将 ISBN 小写,写成如下,就是对的。
因为 XML 文档是区分大小写的 (case sensitve)。ISBN 和 isbn 表示两个不同的属性。
<books ISBN ="9787544238212" isbn ="97875442dr">
XML 元素是 XML 文档的基本单位。一个 XML 文档由一个或者多个 XML 元素构成。
比如 <site>woyouxian.net</site> 就是一个 XML 元素,也可以是一个最简单的 XML 文档。
一个 XML 元素从一个起始标记开始,到对应的结束标记结束。在起始标记和结束标记之间的内容,我们称为 XML 元素的内容 (element's content)。比如,woyouxian.net 就是元素 <site>woyouxian.net</site> 的内容。
空元素 (empty element)
如果一个 XML 元素没有内容,比如,<site></site> 我们称其为空元素 (empty element)。
空元素有一种特殊的写法,以 < 开始,然后是元素名称,然后以 /> 结束。比如,<site /> 。
大小写敏感 (case sensitive)
XML 文档是区分大小写的。比如<SITE> 和 <site> 就表示两个不同的元素。这一点在编写 XML 文档时要非常非常注意。
XML 树状结构
XML 文档是树状结构的。它只有一个根元素 (root element),其它元素都是根元素的后代。
<?xml version="1.0" encoding="UTF-8"?>
<father>Tom Smith
<son>John Smith
<grandson>Hans Smith</grandson>
</son>
<daughter>Jane Smith</daughter>
</father>
比如,我们看上面的例子,根元素是 father,father 下面有 2 个子节点,即 son 和 daughter 元素,而 son 元素下面又有一个子节点,就是 grandson 元素。
XML 文档的数据,就是象这样,通过树状结构构成的。
XML 元素之间的关系
XML 元素之间的关系,主要有:
· child
· parent
· sibling 兄弟姐妹
以上面的例子来解释这些关系。
son 元素就是 father 元素的 child。
father 元素就是 son 元素和 daughter 的 parent。
daughter 和 son 元素的关系是 sibling 的关系。
XML 可以带有属性 (attribute),作为 XML 元素 (element) 的附加信息。
比如 <book ISBN ="9787544238212"> 就是一个带有属性的 XML 元素。ISBN 是属性名称 (name),9787544238212 是属性的值 (value)。
XML 属性是以名称和值 (name-value) 的形式配对出现的。
XML 属性应写在开始标记里面,在开始标记的名称之后。
XML 属性名称是区分大小写的,比如 Name 和 name 就表示两个不同的属性。
XML 属性的值应用引号围起来,你可以用双引号,也可以用单引号,以下的写法都是正确的。不过通常来说,XML 属性采用双引号。
<book ISBN ="9787544238212">
<book ISBN ='9787544238212'>
如果属性的值里包含双引号,就用单引号包围属性值,比如:
<site info ='wo"you"xian.net'>
如果属性值里包含单引号,就用双引号包含属性值。
<site info ="wo'you'xian.net">
一个 XML 元素可以有一个或者多个属性。每个属性都以空格分开。比如:
<site name="woyouxian.net" author="me">
使用 XML 元素还是属性
没有硬性规定说那些数据应该使用元素,哪些数据应该使用属性,比如以下这两种写法都是对的。
第一种写法,使用属性:
<site name="woyouxian.net">
第二种写法,使用元素:
<site>
<name>woyouxian.net</name>
</site>
通常来说,元数据 (metadata) 应使用属性,而数据本身应当使用元素。
还有,通常 ID 索引,大都使用属性。比如:
<employee ID="6699">
元数据
在计算机语言里,你经常可以看到一个前缀 -- meta,meta 就是"关于" (about) 的意思。
元数据,metadata,意为描述数据的数据,英文即 data about data。
比如一篇文章,文章关键词就是元数据,而文章的内容就是数据本身。示例如下:
<article keywords="XML,属性" >
<content>XML 可以带有属性 ,作为 XML 元素的附加信息。XML 属性是以名称和值的形式配对出现的。XML 属性应写在开始标记里面,在开始标记的名称之后。</content>
</article>
XML 名称命名规则
XML 名称可以包含英文字母,和数字,或者其它字符(比如下划线)。
XML 名称不能以数字或者标点符号开头。
XML 不能以 xml 开头 (或者 xml 形式的大小写,因为这是 XML 相关标准的保留词)
XML 名称不能包含空格。
虽然 XML 名称可以包含非英语的字符,比如 as ö, ç 等,但是考虑到读取 XML 文档的软件未必支持多语言,为求兼容性,建议还是使用英文字母比较安全。
虽然 XML 支持下划线 (_),连字符 (-),句号(.) 和冒号(:),但 XML 开头不能用连字符 (-) 和句号(.) 冒号(:) ,这是 XML Namespace 用到的保留符号,这在以后章节会详述。所以保险起见,你只用下划线 (_) 就行了,其它的标点符号都不用。
正确的 XML 名称示例:
<name>
<first_name>
<one_4_all>
错误的 XML 名称示例:
<mom's pie>
<mon/day/year>
<4-u>
<first name>
XML 文档里,除了表示一个标记的开始之外,不允许有小于号 <,因为小于号 < 总是被XML 解析器解释为一个标记的开始。
<person>if age < 10 </person>
上面的写法会导致 XML 文档的错误。
为避免这样的错误,而你又需要在 XML 文档内容里使用小于号,你可以使用小于号的实体引用 (entity reference) ,即 < 来替换小于号。下面是正确的写法:
<person>if age < 10 </person>
XML 里也不能用 & 这个字符,因为 & 被解析为某个实体引用的开始。所以,你必须使用& 的实体引用 & 来替代 & 。比如,
<company>John & Hans</company>
应该写成
<company>John & Hans</company>
XML 有 5 个预定的实体引用 (entity references)。它们分别是:
实体引用 |
字符 |
说明 |
< |
< |
小于号 |
>: |
> |
大于号 |
& |
& |
和 |
' |
' |
单引号 |
" |
" |
双引号 |
当 XML 解析器解析含有上述实体引用的 XML 文档时,会将这些实体引用转换成相应的字符。
只有 < 和 & 字符在 XML 是非法的。另外几个是合法的。但是 > 容易被看成一个标记的结束符号,而' 和 " 这两个符号,又经常作为 XML 属性的开始符号和结束符号,所以为了避免 XML 书写的错误,建议将这三个符号也用其实体引用来表示。
为了避免 XML 解析错误,我们应该使用 < 来替代 <,使用 & 替代 &。
但是假设你需要在 XML 文档里写一段内容,里面包含了很多 < 或者 &,要将所有 < 或者 & 转换成实体引用是很讨厌的事情。
这时候,你可以使用 CDATA 区 (CDATA section)。在 CDATA 区里,你可以不必使用实体引用,因为 XML 解析器不会解析 CDATA 区内的内容。
CDATA 区 (CDATA section) 以 <![CDATA[ 开始,以 ]]> 结束。 示例如下:
<mycode> This is a html page
<![CDATA[
<html>
<head>
<title>woyouxian</title>
</head>
<body>
I like woyouxian.net
</body>
</html>
]]>
</mycode>
注意:在 CDATA 区内,不能出现 ]]> 。
你可以在 XML 文档里写注释,以帮助他人或者自己日后理解。
XML 的注释以 <!-- 开始,以 --> 结束。示例如下:
<!-- This is a comment. -->
注意:在 XML 注释里面,除了结束符 -->,当中不能有连续两个连字符 --。
在结束 XML 注释时,---> 也是非法的。
XML 的注释可以放在 XML 的元素内容里,但是不能放在标记里。
XML 文档应当以 XML 声明 (declaration) 开始,不过不是必须的。
下面就是一个简单的 XML 文档示例,第一行就是 XML 声明。
如果一个 XML 文档含有声明,必须放在 XML 文档的第一行。
XML 文档声明主要有三个参数:
· 版本 (version)
· 字符编码 (encoding)
· 独立 (standalone)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<site>
woyouxian.net
</site>
版本(version)
版本表示遵循的是 W3C 的 XML 1.0 的标准。
字符编码 (encoding)
字符编码表示该 XML 文档使用的字符编码。
一些英文的 XML 文档,你会看到它们使用的是单字节的 ISO-8859-1 编码。不过对于中文文档来说,应该使用支持双字节 UTF-8 或者 Unicode。
如果是含有非英语字符的 XML 文档,你需要将 XML 文档存成 UTF-8 或者 Unicode 格式。
独立 (standalone)
如果 XML standalone 的值是 no ,表示它需要 DTD (DTD 放在以后再说)。
不需要 DTD 的 XML 文档, standalone 值应该写 yes。
格式正确 (Well-Formed) 的 XML 文档必须遵循以下规则:
· 每个开始标记必须有结束标记。
· XML 文档只有一个根元素。
· XML 元素必须正确嵌套。
· XML 元素不能有相同名称的属性。
· XML 属性值必须加引号。
· XML 注释不能写在标记里。
· XML 文档里不能出现 < 和 & 标记,必须用实体引用 < 替代 <, & 替代 &。