XML

可扩展标记语言（Extensible Markup Language，简称：XML）是一种标记语言和用于存储、传输和重构松散数据的文件格式。它定义了一系列编码文档的规则以使其在人类可读的同时机器可读。万维网联盟于1998年发布的 XML 1.0 规范和其他相关开源标准共同定义了 XML。

XML 的设计目标是注重简洁、通用和因特网可用性。它是一种通过 Unicode 编码实现对多种语言有强大支持的文本数据格式。尽管 XML 的设计重心在于文档，它被广泛应用于网络服务中松散数据结构的表示。

## 总览

XML 的主要目的是序列化（如存储、传输和重构松散数据）。对于两个需要传输信息的不同系统，它们也需要在文件格式上达成一致。XML 规范了这个流程，因此其类似于用于表示信息的通用语言。

作为一个标记语言，XML 标记，分类和在结构方面组织数据。XML 标签代表结构且包含元数据，标签内是照 XML 标准编码的数据。一个附加的 XML 结构（XSD）定义了用于解释和验证 XML 的必要的元数据（这也被称为结构典范）。一个符合 XML 基本语法的文档是“结构良好”的（well-formed），一个符合其附加结构的是“有效”（valid）的。

互联网工程任务组的 RFC 7303（取代了旧的 RFC 3023）提供了用于构造 XML 中媒体类型的规则。它定义了三种媒体类型：

```mime
application/xml                             (text/xml是一个别名)
application/xml-external-parsed-entity      (text/xml-external-parsed-entity是一个别名)
application/xml-dtd
```

它们被用于在不暴露内容的同时传输未经处理的 XML 文件。RFC 7303 还建议基于 XML 的语言的媒体类型应以 +xml 结尾（如 SVG 的 image/svg+xml）。

对于 XML 在网络中的进一步使用指南于 RFC 3470 （也被称为 IETF BCP 70，包含设计部署基于 XML 的语言的各个方面）提出。

## 应用

<image>

XML 在互联网信息交换中已经被广泛应用。数以百计使用 XML 语法的文档格式（包括 RSS、Atom、Office Open XML、OpenDocument、SVG、COLLADA 和 XHTML）被开发出来。XML 还为多种通信协议（如 SOAP 和 XMPP）提供了基础语言。它还是AJAX使用的信息交换格式之一。

许多工业数据标准，如Health Level 7、OpenTravel Alliance、FpML、MISMO和National Information Exchange Model，基于 XML 和 XML 附加结构丰富的特性。在出版领域，Darwin Information Typing Architecture 是一个 XML 行业数据标准。XML 被广泛应用与支持各种出版格式。

## 关键术语

该部分内容基于 XML 规范。注意这并不是一个详尽的列出所有结构的列表，而是提供 XML 中常见组成的介绍。

### 字符（ Character ）

XML 1.0 规范允许的（转义后的最终解码值）合法字符： #x9（水平制表符）、#xA（回车符）、#xD（换行符）、#x20-#xD7FF、#xE000-#xFFFD、#x10000-#x10FFFF。即任何Unicode字符，不包含 surrogate blocks, FFFE, FFFF。

XML 规范定义了5个"预定义实体"来表示特殊字符. XML也允许在每个文档定义任意数量的其它命名实体.

下表列出了5个XML预定义实体. 通过名字引用这些实体的格式为`&amp;name;`，例如, `&amp;amp;` 将绘制为&.

名字｜字符｜Unicode码位(十进制)｜标准｜描述

quot｜"｜U+0022 (34)｜XML 1.0｜双引号

amp｜&｜U+0026 (38)｜XML 1.0｜&

apos｜'｜U+0027 (39)｜XML 1.0｜撇号

lt｜U+003E (62)｜XML 1.0｜大于号

### 处理器（ Processor ）与应用（ Application ）

XML 处理器（Processor，也称作XML parser）分析标记语言并传递结构化信息给应用（application）。

XML 规范规定了处理器要做什么不能做什么，但是应用并不在其讨论范围内。规范称之为处理器的东西一般被通俗的称为 XML 解析器。

### 标记（ Markup ）与内容（ Content ）

XML文档的字符分为标记（Markup）与内容（content）两类。可由简单的语法判断出来：标记通常以`&lt;`开头，以`>`结尾；或者以字符`&` 开头，以`;`结尾。不是标记的字符就是内容。但是CDATA部分，分解符号`&lt;![CDATA[`与`]]>`是标记，二者之间的文本为内容。最外界的空白符是标记。

### 标签（ Tag ）

一个tag属于标记结构，以`&lt;`开头，以`>`结尾。Tag名字是大小写敏感，不能包括任何字符 !"#$%&'*+,/;?@\^`

- 起始标签 start-tag，如`&lt;section>`; * 结束标签 end-tag，如`&lt;/section>`; * 空白标签 empty-element tag，如`&lt;line-break />`. === 元素（Element） === 元素是文档逻辑组件，它在起始标签与匹配的结束标签之间，或者仅由一个空白标签组成。例如：`&lt;greeting>Hello, world!&lt;/greeting>`. 另一个例子是： `&lt;line-break&nbsp;/>`.在标签间的内容可以包含其他元素（称为子元素） === 属性（Attribute） === 属性是由名称-值对组成的标记结构，存在于开始标签或空元素标签内。例如，`<img src="madonna.jpg" alt="Madonna" />`中，属性的名称是 "src" 和 "alt"，它们的值分别是 "madonna.jpg" 和 "Madonna"。另一个例子是`<step number="3">Connect A to B.</step>`，其中属性的名称是 "number"，其值是 "3"。XML 属性只能有一个值，每个属性在每个元素上最多只能出现一次。在常见情况下，如果需要包含多个值的列表，则必须通过将列表编码为符合良构性的 XML 属性，其格式超出了 XML 本身的定义。通常，这可以是以逗号或分号分隔的列表，或者如果已知各个值不包含空格ii，则可以使用以空格分隔的列表。例如，`<div class="inner greeting-box">Welcome!</div>`中，属性 "class" 的值是 "inner greeting-box"，同时表示两个 CSS 类名 "inner" 和 "greeting-box"。=== XML 声明（Declaration） === XML文档如果以XML declaration开始，则表述了文档的一些信息。如`&lt;?xml version="1.0" encoding="UTF-8"?>`. == 字符与转义 == XML 文档完全由 Unicode 字符库中的字符组成。除了少数特殊排除的控制字符外，Unicode 定义的任何字符都可以出现在 XML 文档的内容中。XML 包含用于识别构成文档的 Unicode 字符编码的工具，以及用于表达由于某种原因不能直接使用的字符的工具。=== 有效字符 === 以下范围内的Unicode字码在 XML 1.0 文档中是有效的：
- U+0009 ( 水平制表符 ), U+000A ( 换行 ), U+000D ( 回车 ): 这些是在 XML 1.0 中唯一接受的控制字符
- U+0020 - U+D7FF, U+E000 - U+FFFD: 这些排除了BMP中的一些非字符（所有代理项，U+FFFE和U+FFFF是不被允许的）
- U+10000 - U+10FFFF: 这些包含所有在增补计划中的字码，包含非字符 XML 1.1 扩充了允许的字符集以包含上述内容和U+0001 - U+001F，但同时，它限制使用 U+0009（水平制表符）、U+000A（换行）、U+000D（回车）和 U+0085（下一行）以外的 C0 和 C1 控制字符），要求它们以转义形式编写（例如 U+0001 必须写为 或其等效形式）。对于 C1 字符，此限制是向后不兼容；引入它是为了检测常见的编码错误。U+0000 （空）是唯一在任何 XML 1.1 文档中都不被允许的字码。=== 编码检测 === Unicode 字符集可被编码为二进制字节以存储或通过多种方式传输，这个过程被称为编码。Unicode 本身定义了一个覆盖全字符集的编码格式，其中知名的包含 UTF-8（不包含位顺序记号，是XML 标准文档推荐使用的格式）和 UTF-16。还有许多早于 Unicode 的文字编码，如 ASCII 和多种 ISO/IEC 8859 字符集，但是它们的字符集都是 Unicode 字符集的子集。XML 允许使用任何 Unicode 定义的编码以及其他字符集是Unicode子集的编码。XML 还提供了一种机制，使XML 处理器可以在没有任何先验知识的情况下可靠地确定正在使用哪种编码。除 UTF-8 和 UTF-16 之外的编码不一定能被每个 XML 解析器识别（有些时候甚至不能识别 UTF-16，尽管标准要求它也被识别）。=== 转义 === XML 提供了转义工具以包含哪些不能直接引入的字符，例如：
- 字符“<”和“&”是关键的语法标记，因此不能出现在 CDATA 部分之外的内容中。虽然被允许但是不建议在 XML 实体值中使用“<”
- 某些字符编码仅支持 Unicode 字符集中的部分字符（子集）。例如，用 ASCII 编码 XML 文档是合法的，但 ASCII 缺少 Unicode 字符（例如“é”）的字码
- 在作者的机器上可能无法输入这个字符
- 某些字符的字形无法在视觉上与其他字符区分开来，例如不间断空格 (&#xa0) " " 和空格 (&#x20) " "，以及西里尔大写字母 A (&#x410) “А”和拉丁文大写字母 A (&#x41)“A” ~，也不能包含空格，并且不能以“-”、 “.”或数字开头
- 仅存在一个根元素
- 单个根元素包含所有其他元素。

XML 文档的定义排除了那些违反了良构性规则的文本；这些文本根本不是 XML。遇到这种违反规则的情况时，XML 处理器需要报告这些错误并停止正常处理。这种政策，偶尔被称为“严格错误处理”，与处理 HTML 的程序的行为形成了明显对比，因为这些程序在存在严重标记错误的情况下，仍然能够产生合理的结果。这一方面的政策被批评为违反了 Postel 法则（“对发送的内容要保守，对接受的内容要宽容”）。

XML 规范将一个有效的 XML 文档定义为一个既符合良构性规则，又遵循文档类型定义（DTD）规则的 XML 文档。

## 例

XML定义结构、存储信息、传送信息。下例为小张发送给大元的便条，存储为XML。

```xml
<?xml version="1.0"?>
  <小紙條>
    <收件人>大元</收件人>
    <發件人>小張</發件人>
    <主題>問候</主題>
    <具體內容>早啊，飯吃了沒？ </具體內容>
  </小紙條>
```

这XML文档仅是纯粹的信息标签，这些标签意义的展开依赖于应用它的程序。

### 结构

每个XML文档都由XML声明开始，在上面的代码中的第一行就是XML声明。这一行代码会告诉解析器或浏览器，这个文件应该按照XML规则进行解析。

但是，根元素到底叫还是，则是由文档类型定义（DTD）或XML纲要（XML Schema）定义的。如果DTD规定根元素必须叫，那么若写作就不符合要求。这种不符合DTD或XML纲要的要求的XML文档，被称作不合法的XML，反之则是合法的XML。

XML文件的第二行并不一定要包含文档元素；如果有注释或者其他内容，文档元素可以迟些出现。

最常见的PI（processing instruction,像XML序言, 却是不同类型的语法）是用来指定XML文件的样式表, 这个PI一般会直接放在XML序言之后，通常由Web浏览器使用，来将XML数据以特殊的样式显示出来。

XML的结构有一个缺陷，那就是不支持分帧（framing）。当多条XML消息在TCP上传输的时候，无法基于XML协议来确定一条XML消息是否已经结束。

## 延伸阅读

- Annex A of ISO 8879:1986 (SGML)

## 基本资料

- 头衔：XML (标准)
- 车队名称：可扩展标记语言
- 状态：已发布, 万维网联盟
- 开始年：1996
- 首次出版：1998年2月10日
- 版本：1.1 (第二版)
- version_date：2006年9月29日
- 组织：万维网联盟
- 编辑：Tim Bray, Jean Paoli, Michael Sperberg-McQueen, Eve Maler, François Yergeau, John W. Cowan
- 基础标准：SGML
- 有关标准：XML Schema
- 领域：序列化
- 日语原文：XML (文件格式)
- 扩展名：.xml
- mime：application/xml, text/xml
- 统一类型标识：public.xml
- UTI结构：public.text
- magic：<?xml
- 所有者：万维网联盟
- 格式类型：标记语言
- 扩展自：SGML
- 扩展为：XHTML, RSS, Atom, KML 等等
- 标准： 1.0, 第五版 1.1, 第二版
- 免费在线档案：是
- 启用：是