XML - 可扩展标记语言 (Extensible Markup Language)

XML 可扩展标记语言 (Extensible Markup Language)

XML 是英文 Extensible Markup Language 的缩写,它的中文意思是 "可扩展标记语言"

编写和浏览一个 XML 文档

XML 文档以 .xml 为后缀。

编写一个 XML 文档,不需要特别的软件,只需要一个文本编辑器就可以,比如记事本程序 (Notepad)

你可以打开 Notepad,然后将下面这段代码拷贝下来,然后存成以 .xml 为后缀的文件,比如 book.xml,然后存盘,这样就生成了一个 XML 文档。



  The Book Thief
  25
  10

你可以使用文本编辑器( Notepad EditPlus),浏览器 (IE 或者 Firefox),或者 XML专用工具 (XMLSpy) 打开并浏览 XML 文件。

我们可以通过这个 XML 文档的例子对 XML 有个初步的认识。

XML 文档的第一行是 XML 声明,定义了 XML 的版本和使用的字符编码。在这个例子中,XML 遵守的版本是 1.0,使用的字符编码是 UTF-8 字符集。

XML 文档有一个根元素 (root element) 叫做 booksbooks 根元素下又有 3 个元素,分别是 title, price, quantity

每个 XML 元素都以一个起始标记 (opening tag) 开始 ,以一个结束标记 (closing tag) 收尾。

比如 </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">就是一个起始标记,</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> 就是一个结束标记。

起始标记以 < 开始,以 > 结束。结束标记以 开始,以 > 结束。

XML 元素可以带有属性,属性值要加引号。比如 ISBN 就是 books 的属性,属性值为 9787544238212

XML 的标记 (tag) 是可以自定义的,用来描述数据。比如该例子中的 title 元素,

The Book Thief

title 标记表示这个元素内的数据是书名,The Book Thief 就是一个具体书名。

你可以修改标记,比如写成

The Book Thief

由于 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)

        The book thief

        25

        10

上面是一个简单的 XML 文档,我们看到有很多这样的相同特征的字符串,</span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">,</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"><price></span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">,</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"><quantity></span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">,</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"></books> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">等等。</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"></span></span></p> <p class="MsoNormal" style="text-align: left; line-height: 11pt; margin: 0cm 0cm 0pt; background: #f2f2f2; mso-pagination: widow-orphan;"><span style="font-size: small;"><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">它们都是由小于号</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: "Courier New"; background: #e8ebe8; color: #222222; mso-font-kerning: 0pt; mso-border-alt: solid olivedrab .5pt; border: olivedrab 1pt solid; padding: 0cm;"><</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">开始,由大于号</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: "Courier New"; background: #e8ebe8; color: #222222; mso-font-kerning: 0pt; mso-border-alt: solid olivedrab .5pt; border: olivedrab 1pt solid; padding: 0cm;">></span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">结束,在</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> XML </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">文档里,我们将其称为</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> <strong><span>XML </span></strong></span><strong><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">标记</span></strong><strong><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> (tag)</span></strong><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">。</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"></span></span></p> <p class="MsoNormal" style="text-align: left; line-height: 11pt; margin: 1.5pt 0cm; background: #f2f2f2; mso-pagination: widow-orphan;"><span style="font-size: small;"><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">标记又有<strong>开始标记</strong>和<strong>结束标记</strong>之分。</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"></span></span></p> <p class="MsoNormal" style="text-align: left; line-height: 11pt; margin: 0cm 0cm 0pt; background: #f2f2f2; mso-pagination: widow-orphan;"><span style="font-size: small;"><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">开始标记由</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: "Courier New"; background: #e8ebe8; color: #222222; mso-font-kerning: 0pt; mso-border-alt: solid olivedrab .5pt; border: olivedrab 1pt solid; padding: 0cm;"><</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">开始,由</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: "Courier New"; background: #e8ebe8; color: #222222; mso-font-kerning: 0pt; mso-border-alt: solid olivedrab .5pt; border: olivedrab 1pt solid; padding: 0cm;">></span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">结束。比如</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"><title></span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">,</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"><price></span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">,</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"><quantity></span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">。</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"></span></span></p> <p class="MsoNormal" style="text-align: left; line-height: 11pt; margin: 0cm 0cm 0pt; background: #f2f2f2; mso-pagination: widow-orphan;"><span style="font-size: small;"><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">结束标记由</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: "Courier New"; background: #e8ebe8; color: #222222; mso-font-kerning: 0pt; mso-border-alt: solid olivedrab .5pt; border: olivedrab 1pt solid; padding: 0cm;"></</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">开始,由</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: "Courier New"; background: #e8ebe8; color: #222222; mso-font-kerning: 0pt; mso-border-alt: solid olivedrab .5pt; border: olivedrab 1pt solid; padding: 0cm;">></span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;"> </span><span style="font-family: 宋体; color: #222222; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">结束。比如</span><span style="font-family: Tahoma; color: #222222; mso-font-kerning: 0pt;">

XML 元素 (element) 指的是从一个开始标记到它的结束标记的一段内容。

比如 The book thief 就是一个元素。

元素是 XML 文档的基本单位,一个 XML 文档可以由一个或者多个元素构成

一个元素可以带有属性 (attribute),属性写在开始标记里,写在元素名称的后面。比如

其中 ISBN ="9787544238212" 就是 books 元素的一个属性, ISBN 是属性的名称,9787544238212 是属性值,属性值必须加引号

XML 的语法规则

接下来,我们逐个解释 XML 文档的语法规则。

每个开始标记 (opening tag) 必须有结束标记 (closing tag)

比如上面的例子中, 开始标记 必须有相应的结束标记

一个 XML 文档只能有一个根元素 (root element)

XML 文档是树状结构的,象一棵节点树。比如上面例子中,books 就是根元素,而 titlepricequantity 则是 books 的子节点。

如果写成下面这样,一个文档有两个 books 根元素,就出错了。

        </span><span style="font-family: 宋体; color: #4f4f4f; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">偷书贼</span><span style="font-family: "Courier New"; color: #4f4f4f; mso-font-kerning: 0pt;">

        25

        10

        </span><span style="font-family: 宋体; color: #4f4f4f; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">香水</span><span style="font-family: "Courier New"; color: #4f4f4f; mso-font-kerning: 0pt;">

        100

        12

所有 XML 元素必须正确嵌套

正确的嵌套:

</span><span style="font-family: 宋体; color: #4f4f4f; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">香水</span><span style="font-family: "Courier New"; color: #4f4f4f; mso-font-kerning: 0pt;">

错误的嵌套:

</span><span style="font-family: 宋体; color: #4f4f4f; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">香水</span><span style="font-family: "Courier New"; color: #4f4f4f; mso-font-kerning: 0pt;"></books>

属性值必须加引号

一个 XML 元素可以带有属性 (attribute),属性写在开始标记里,写在元素名称的后面。比如

其中 ISBN ="9787544238212" 就是 books 元素的一个属性, ISBN 是属性的名称,9787544238212 是属性值,属性值必须加引号。

一个元素不能有相同的属性 (attribute)

下面的写法是错误的,因为一个 XML 元素不能有两个相同的属性名称,虽然属性值不同。

不过,如果你将 ISBN 小写,写成如下,就是对的。

因为 XML 文档是区分大小写的 (case sensitve)ISBN isbn 表示两个不同的属性。

XML 元素是 XML 文档的基本单位。一个 XML 文档由一个或者多个 XML 元素构成。

比如 woyouxian.net 就是一个 XML 元素,也可以是一个最简单的 XML 文档。

一个 XML 元素从一个起始标记开始,到对应的结束标记结束。在起始标记和结束标记之间的内容,我们称为 XML 元素的内容 (element's content)。比如,woyouxian.net 就是元素 woyouxian.net 的内容。

空元素 (empty element)

如果一个 XML 元素没有内容,比如, 我们称其为空元素 (empty element)

空元素有一种特殊的写法,以 < 开始,然后是元素名称,然后以 /> 结束。比如,

大小写敏感 (case sensitive)

XML 文档是区分大小写的。比如 就表示两个不同的元素。这一点在编写 XML 文档时要非常非常注意。

XML 树状结构

XML 文档是树状结构的。它只有一个根元素 (root element),其它元素都是根元素的后代。


Tom Smith
   John Smith
       Hans Smith
  

   Jane Smith

比如,我们看上面的例子,根元素是 fatherfather 下面有 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) 的附加信息。

比如 就是一个带有属性的 XML 元素。ISBN 是属性名称 (name)9787544238212 是属性的值 (value)

XML 属性是以名称和值 (name-value) 的形式配对出现的。

XML 属性应写在开始标记里面,在开始标记的名称之后。

XML 属性名称是区分大小写的,比如 Name name 就表示两个不同的属性。

XML 属性的值应用引号围起来,你可以用双引号,也可以用单引号,以下的写法都是正确的。不过通常来说,XML 属性采用双引号。

如果属性的值里包含双引号,就用单引号包围属性值,比如:

如果属性值里包含单引号,就用双引号包含属性值。

一个 XML 元素可以有一个或者多个属性。每个属性都以空格分开。比如:

使用 XML 元素还是属性

没有硬性规定说那些数据应该使用元素,哪些数据应该使用属性,比如以下这两种写法都是对的。

第一种写法,使用属性:

第二种写法,使用元素:

        woyouxian.net

通常来说,元数据 (metadata) 应使用属性,而数据本身应当使用元素。

还有,通常 ID 索引,大都使用属性。比如:

元数据

在计算机语言里,你经常可以看到一个前缀 -- metameta 就是"关于" (about) 的意思。

元数据,metadata,意为描述数据的数据,英文即 data about data

比如一篇文章,文章关键词就是元数据,而文章的内容就是数据本身。示例如下:

属性" >

        XML 可以带有属性 ,作为 XML 元素的附加信息。XML 属性是以名称和值的形式配对出现的。XML 属性应写在开始标记里面,在开始标记的名称之后。

XML 名称命名规则

XML 名称可以包含英文字母,和数字,或者其它字符(比如下划线)

XML 名称不能以数字或者标点符号开头

XML 不能以 xml 开头 (或者 xml 形式的大小写,因为这是 XML 相关标准的保留词)

XML 名称不能包含空格

 

虽然 XML 名称可以包含非英语的字符,比如 as ö, ç 等,但是考虑到读取 XML 文档的软件未必支持多语言,为求兼容性,建议还是使用英文字母比较安全。

虽然 XML 支持下划线 (_),连字符 (-),句号(.) 和冒号(:),但 XML 开头不能用连字符 (-) 和句号(.) 冒号(:) ,这是 XML Namespace 用到的保留符号,这在以后章节会详述。所以保险起见,你只用下划线 (_) 就行了,其它的标点符号都不用。

正确的 XML 名称示例:

错误的 XML 名称示例:

<4-u>

XML 文档里,除了表示一个标记的开始之外,不允许有小于号 <,因为小于号 < 总是被XML 解析器解释为一个标记的开始。

if age < 10

上面的写法会导致 XML 文档的错误。

为避免这样的错误,而你又需要在 XML 文档内容里使用小于号,你可以使用小于号的实体引用 (entity reference) ,即 < 来替换小于号。下面是正确的写法:

if age < 10

XML 里也不能用 & 这个字符,因为 & 被解析为某个实体引用的开始。所以,你必须使用& 的实体引用 & 来替代 & 。比如,

John & Hans

应该写成

John & Hans

XML 5 个预定的实体引用 (entity references)。它们分别是:

实体引用

字符

说明

<

小于号

>:

大于号

&

&

'

'

单引号

"

"

双引号

XML 解析器解析含有上述实体引用的 XML 文档时,会将这些实体引用转换成相应的字符。

只有 < & 字符在 XML 是非法的。另外几个是合法的。但是 > 容易被看成一个标记的结束符号,而' " 这两个符号,又经常作为 XML 属性的开始符号和结束符号,所以为了避免 XML 书写的错误,建议将这三个符号也用其实体引用来表示。

为了避免 XML 解析错误,我们应该使用 < 来替代 <,使用 & 替代 &

但是假设你需要在 XML 文档里写一段内容,里面包含了很多 < 或者 &,要将所有 < 或者 & 转换成实体引用是很讨厌的事情。

这时候,你可以使用 CDATA (CDATA section)。在 CDATA 区里,你可以不必使用实体引用,因为 XML 解析器不会解析 CDATA 区内的内容。

CDATA (CDATA section) 开始,以 ]]> 结束。 示例如下:

This is a html page

       

       

        woyouxian

       

       

        I like woyouxian.net

       

       

        ]]>

注意:在 CDATA 区内,不能出现 ]]>

你可以在 XML 文档里写注释,以帮助他人或者自己日后理解。

XML 的注释以 结束。示例如下:

注意:在 XML 注释里面,除了结束符 -->,当中不能有连续两个连字符 --

在结束 XML 注释时,---> 也是非法的。

XML 的注释可以放在 XML 的元素内容里,但是不能放在标记里。

XML 文档应当以 XML 声明 (declaration) 开始,不过不是必须的。

下面就是一个简单的 XML 文档示例,第一行就是 XML 声明。

如果一个 XML 文档含有声明,必须放在 XML 文档的第一行。

XML 文档声明主要有三个参数:

·                                 版本 version)

·                                 字符编码 (encoding)

·                                 独立 (standalone)

   woyouxian.net

版本(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 文档里不能出现 < & 标记,必须用实体引用 < 替代 < & 替代 &

 

你可能感兴趣的:(XML - 可扩展标记语言 (Extensible Markup Language))