XML

由萬維網聯盟開發的用於數據編碼的標記語言

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

XML (标准)
可扩展标记语言
状态已发布, 万维网联盟
开始年1996
首次出版1998年2月10日,​26年前​(1998-02-10
最新版本1.1 (第二版)
2006年9月29日,​18年前​(2006-09-29
组织万维网联盟
编辑Tim Bray, Jean Paoli, Michael Sperberg-McQueen, Eve Maler, François Yergeau, John W. Cowan
基础标准SGML
有关标准XML_Schema
领域序列化
缩写XML
网站www.w3.org/xml
XML (文件格式)
扩展名
.xml
互联网媒体类型
application/xml, text/xml
统一类型标识public.xml
UTI结构public.text
开发者万维网联盟
格式类型标记语言
扩展自SGML
扩展为XHTML, RSS, Atom, KML 等等
标准1.0, 第五版 (2008年11月26日 (2008-11-26)) 1.1, 第二版 (2006年8月16日 (2006-08-16))
自由格式
免费格式?

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

总览

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

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

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

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 的语言的各个方面)提出。

应用

 
SVG代码示例

XML 在互联网信息交换中已经被广泛应用。数以百计使用 XML 语法的文档格式(包括 RSSAtomOffice Open XMLOpenDocumentSVGCOLLADAXHTML)被开发出来[8]。XML 还为多种通信协议(如 SOAPXMPP)提供了基础语言。它还是AJAX使用的信息交换格式之一。

许多工业数据标准,如Health Level 7OpenTravel AllianceFpMLMISMONational 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预定义实体. 通过名字引用这些实体的格式为&name;,例如, & 将绘制为&.

名字 字符 Unicode码位(十进制) 标准 描述
quot " U+0022 (34) XML 1.0 双引号
amp & U+0026 (38) XML 1.0 &
apos ' U+0027 (39) XML 1.0 撇号
lt < U+003C (60) XML 1.0 小于号
gt > U+003E (62) XML 1.0 大于号

处理器( Processor )与应用( Application )

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

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

标记( Markup )与内容( Content )

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

标签( Tag )

一个tag属于标记结构,以<开头,以>结尾。Tag名字是大小写敏感,不能包括任何字符 !"#$%&'()*+,/;<=>?@[\]^`{|}~, 也不能有空格符, 不能以"-"或"."或数字开始。可分为三

  • 起始标签 start-tag,如<section>;
  • 结束标签 end-tag,如</section>;
  • 空白标签 empty-element tag,如<line-break />.

元素( Element )

元素是文档逻辑组件,它在起始标签与匹配的结束标签之间,或者仅由一个空白标签组成。例如:<greeting>Hello, world!</greeting>. 另一个例子是: <line-break />.在标签间的内容可以包含其他元素(称为子元素)

属性( 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开始,则表述了文档的一些信息。如<?xml version="1.0" encoding="UTF-8"?>.

字符与转义

XML 文档完全由 Unicode 字符库中的字符组成。 除了少数特殊排除的控制字符外,Unicode 定义的任何字符都可以出现在 XML 文档的内容中。

XML 包含用于识别构成文档的 Unicode 字符编码的工具,以及用于表达由于某种原因不能直接使用的字符的工具。

有效字符

以下范围内的Unicode字码在 XML 1.0 文档中是有效的:[9]

  • 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[10],但同时,它限制使用 U+0009( 水平制表符 )、U+000A( 换行 )、U+000D( 回车 )和 U+0085(下一行)以外的 C0 和 C1 控制字符 ),要求它们以转义形式编写(例如 U+0001 必须写为 &#x01; 或其等效形式)。 对于 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”
五个预定义实体
转义前 转义后
&lt; <
&gt; >
&amp; &
&apos; '
&quot; "

所有有效的 Unicode 字符都可以用数字字符引用表示。 例如汉字“中”,其在 Unicode 中的数字代码是十六进制 4E2D,即十进制 20,013。 如果用户无法输入该字符,则仍然可以通过 &#20013; 或&#x4e2d; 代表“中”这个字符。 类似地,字符串“I <3 Jörg”可以被编码为包含在 XML 文档中,如 I &lt;3 J&#xF6;rg

&#0; 是不允许的,因为即使使用数字字符引用,空字符也是 XML 排除的控制字符之一。[11]需要使用 Base64 等替代编码机制来表示此类字符。

注释

注释可以在文档内标记外的、XML声明之后的任何地方出现,始于 。为了兼容SGML,注释内不得出现"--",这意味着注释不能嵌套。& 符号在注释中没有特殊意义,因此实体和字符引用不会被识别,自然无法表示文档编码字符集之外的字符。

国际化

XML 1.0(第五版)和 XML 1.1 支持在元素名称、属性、注释、字符数据和处理指令中直接使用几乎任何 Unicode 字符(除了在 XML 中具有特殊符号含义的字符,例如小于符号“<”)。 以下是一个格式良好的 XML 文档,包括中文、亚美尼亚语和西里尔语字符:

<?xml version="1.0" encoding="UTF-8"?>
<俄语 լեզու="ռուսերեն">дані</俄语>

句法修正和错误处理

XML 规范中将符合语法规范的 XML 文档定义为格式良好的文档。规范中的语法规范中的关键点包括:

  • 该文档仅包含正确编码的合法 Unicode 字符
  • 除非执行标记描述的作用,否则不应出现任何特殊语法字符(例如 < 和 &)
  • 分隔元素的开始标记、结束标记和空白标记正确嵌套,无丢失、无重叠
  • 标签名称区分大小写; 开始标记和结束标记必须完全匹配
  • 标签名称不能包含任何非法字符: !"#$%&'()*+,/;<=>?@[\]^`{|}~ ,也不能包含空格,并且不能以“-”、 “.”或数字开头
  • 仅存在一个根元素
  • 单个根元素包含所有其他元素。

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

XML 规范将一个有效的 XML 文档定义为一个既符合良构性规则,又遵循文档类型定义(DTD)规则的 XML 文档。[14]

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

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

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

结构

每个XML文档都由XML声明开始,在上面的代码中的第一行就是XML声明,<?xml version="1.0"?>。这一行代码会告诉解析器或浏览器,这个文件应该按照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消息是否已经结束。

参考文献

  1. ^ Extensible Markup Language (XML) 1.0. www.w3.org. [2024-02-14]. (原始内容存档于2024-04-20). 
  2. ^ Extensible Markup Language (XML) 1.0 (Fifth Edition). World Wide Web Consortium. 2008-11-26 [2024-02-14]. (原始内容存档于2021-03-24) (英语). 
  3. ^ Wayback Machine (PDF). [2024-02-14]. (原始内容存档 (PDF)于2013-04-24). 
  4. ^ Document license - 2015 version. W3C. [2024-02-14]. (原始内容存档于2024-05-26) (英语). 
  5. ^ Document license - 2015 version. W3C. [2024-02-14]. (原始内容存档于2020-01-10). 
  6. ^ Fennell, Philip. Extremes of XML. XML London: 80-86. 2013-09-14. ISBN 978-0-9926471-0-0. doi:10.14337/XMLLondon13.Fennell01 (英语). 
  7. ^ 7.0 7.1 7.2 7.3 7.4 Dykes, Lucinda. XML for Dummies 4th ed. Hoboken, N.J: Wiley. 2005. ISBN 978-0-7645-8845-7. 
  8. ^ Cover, Robin. XML Applications and Initiatives. xml.coverpages.org. [2024-02-15]. (原始内容存档于2024-05-02). 
  9. ^ Characters. Extensible Markup Language (XML) 1.0 (Fifth Edition). [2024-02-15]. (原始内容存档于2003-12-24). 
  10. ^ Characters. Extensible Markup Language (XML) 1.1 (Second Edition). [2024-02-15]. (原始内容存档于2021-08-11). 
  11. ^ Texin, Yergeau, Tex, François. HTML, XHTML, XML and Control Codes. W3C. 2003-09-06 (英语). 
  12. ^ Pilgrim, Mark. The history of draconian error handing in XML. Dive into Mark. 2004-01-16. (原始内容存档于2011-07-26) (英语). 
  13. ^ There are No Exceptions to Postel’s Law [dive into mark]. Dive into Mark. 2004-01-08. (原始内容存档于2011-05-14) (英语). 
  14. ^ XML Notepad. CodePlex. (原始内容存档于2017-11-15) (英语). 

延伸閱讀

外部链接

参见