关键术语
这部分材料基于XML规范说明。这并非出现在XML中的一份所有构建的全面清单;这提供了对日常使用中经常会碰到的关键构建的介绍。
字符
一份XML文档是一串字符串。几乎每个合法Unicode字符都可以出现在一份XML文档中。
XML处理器与应用
XML处理器分析标记并将结构化信息传递给应用。规范对XML处理器必须做什么必须不能做什么提出要求,但是对XML的应用在此范围之外。处理器(XML规范如此称呼)通俗来讲就是一个XML解析器。
标记与内容
构成一份XML文档的字符被划分为标记(markup)和内容(content),这对于含有简单语法规则的应用而言可以进行区分。一般来说,由<
字符开头并以>
字符结尾的字符串构成标记,或者标记也可以用&
开头并以;
结尾的字符串构成。不作为标记的字符串就是内容。然而。在一个CDATA段中,<![CDATA[
与]]>
分隔符被分类为标记,而在它们之间的文本则被分类为内容。在最外层元素的前后空格符被分类为标记。
标签
一个标签(tag)是一个标记构建,以<
开头并以>
结尾。标签有以下三种风格:
- 起始标签:比如
<section>
; - 结束标签:比如
</section>
; - 空元素标签:比如
<line-break />
。
元素
一个元素(element)是一个逻辑文档部分,它要么以起始标签开头并以匹配的结束标签结尾,要么仅由一个空元素标签构成。如果存在起始标签与结束标签之间的字符,那么这些字符为元素的内容,并且也可以含有标记,包括其他元素,那么这些元素则称为子元素(child elements)。一个例子是
<greeting>Hello, world!</greeting>
上述代码表示一个“ 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自身所定义的某些格式才能实现。通常,这要么是以逗号或分号分隔的列表,要么倘若各个值已知不包含空格,那么也可以使用空格作为分隔符来使用。比如:
<div class="inner greeting-box">Welcome!</div>
这里,属性“class”具有值"inner greeting-box"并且也指定了两个CSS类名“ inner”和“greeting-box”。
XML声明
XML文档可以用一个XML声明开头,该声明描述了有关它们自己的一些信息。比如:
<?xml version="1.0" encoding="UTF-8"?>
字符与转义
XML整个文档由Unicode全系列的编码字符构成。除了一小部分特别排除的控制字符,任一由Unicode定义的字符都可以在XML文档内容中出现。
XML包含了标识构成该文档的Unicode字符的编码的工具。并且对于表达字符,出于某些原因,不能被直接使用。
有效字符
在XML1.0文档中,以下范围的Unicode码点都是有效的:
- U+0009(水平制表符),U+000A(换行),U+000D (回车):这些是在XML1.0中所接受的仅有的C0控制字符;
- U+0020~U+D7FF,U+E000~U+FFFD:这排除了某些(但不是全部)BMP(基本多语言平面)中的非字符(所有替代编码,还有U+FFFE和U+FFFF被禁用);
- U+10000~U+10FFFF:这包含了补充屏幕中的所有 码点,包括非字符。
XML1.1扩展了上述允许的字符集,添加了范围U+0001~U+001F范围的字符。同时,它对C0和C1控制字符(而非U+0009水平制表符,U+000A换行符,U+000D回车符,以及U+0085下一行符)的使用做了限制,要求它们以转义的形式来书写。比如,U+0001必须要写作为
或与其等价的转义字符。在C1字符的情况下,该约束是向后兼容的;引入该约束是能检测出通常的编码错误。
码点U+0000(空)是仅有的在XML1.0和XML1.1文档中不被允许的字符。
编码检测
Unicode字符集可以用几种不同的方式编码为字节用于存储或传输。Unicode自身定义了覆盖整个字符集的编码方式,为人熟知的就是UTF-8和UTF-16。在早先的时候还有许多其他文本编码,比如ASCII和ISO/IEC 8859等等,它们的字符集基本上就是Unicode字符集的子集。
XML允许使用任一Unicode所定义的编码,以及出现在Unicode中的字符的其他编码。XML也提供了一种机制,一个XML处理器可以借此可靠地、而不需要事先获悉来判定当前正在使用哪种编码。除了UTF-8和UTF-16以外的编码没必要被每种XML解析器识别。
转义
XML提供了转义工具,用于那些直接包含在XML文档中可能会引发问题的字符。比如:
・比如<
和&
作为关键语法标记而不能直接出现在CDATA段之外的内容中。在XML实体值中可允许使用<
,但不推荐。
・某些只支持Unicode子集的字符编码的解析器。比如,用ASCII编码一个XML文档是合法的,但ASCII缺乏诸如“é”这种字符的码点。
・在作者的机器上可能无法打出的字符。
・某些字符具有不能区别于其他字符的字形(glyph),比如不换行空格字符( 
)以及空格符( 
);还有西里尔大写字母А(А
)以及拉丁大写字母A(A
)。(另外,在Android的string资源xml文件中,空格符使用: 
。)
XML定义了五种预定义的实体:
・<
表示“<”;
・>
表示“>”;
・&
表示“&”;
・'
表示“'”;
・"
表示“"”。
所有允许的Unicode字符都可以用一个数字字符参考来表达。我们看一下中文字符“中”,其Unicode中的数字码为十六进制4E2D,十进制为20013。如果一个用户的键盘没有提供输入该字符的方法,那么可以在XML文档中以中
或中
来使用。
�
是不被允许的,因为空字符是被XML排除在外的控制字符。
注释
注释可以出现在一个文档中其他标记外部的任何地方。注释不能出现在XML的声明之前。注释以``结束。出于对SGML的兼容性,字符串“--”(双连接号)在注释内不允许出现;这意味着注释不能被嵌套。在注释内,“&”符号没有特殊的重要性,因此实体和字符引用不会被如此识别,并且也没有办法来表示文档编码字符集之外的其他字符。
一个有效注释的例子如下:
<!--no need to escape <code> & such in comments-->
国际化使用
XML1.0(第五个版本)以及XML1.1支持直接在元素名、属性、注释、字符数据以及处理指令中使用大部分的Unicode字符。以下是一个良好形式的包含中文、亚美尼亚文与西里尔字母的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<俄语 լեզու="ռուսերեն">данные</俄语>
上述XML文档中所指定的字符编码格式为UTF-8。