空白 [XML 标准]
万维网联合会 (W3C) XML 规范使不同的行尾约定标准化为一个约定,但是保留所有其他空白(属性值中除外)。XML 还提供一组工具,文档可以使用这些工具来通知应用程序是否必须保留空白。
空白和 XML 声明
根据当前的 XML 1.0 标准,在 XML 声明之前不允许包含空白。
<?xml version="1.0"?>
<BOOK>
<BOOKNAME>XML</BOOKNAME>
</BOOK>
如果在 XML 声明之前出现空白,将作为处理指令对待。分析器可能无法使用该信息(特别是编码)。
有关 XML 声明的更多信息,请参见 XML 声明。
元素内容中的空白
需要 XML 分析器报告文档的元素内容中出现的所有空白。因此,对于 XML 分析器来说,下列三个文档是不同的。
<document>
<data>1</data>
<data>2</data>
<data>3</data>
</document>
和:
<document><data>1</data><data>2</data><data>3</data></document>
和:
<document><data>1</data> <data>2</data> <data>3</data></document>
对于某些应用程序,三个数据点的值比好的打印效果更重要。对于面向文档的 XML 应用程序,保留空白可能非常重要。
文档作者可以使用 xml:space 属性来标识文档中认为空白非常重要的部分。样式表还可以使用 xml:space 属性作为保留文档中的空白的挂钩功能。但是,因为许多 XML 应用程序不理解 xml:space 属性,所以,使用该属性只是一个建议。
xml:space 属性接受两个值。
default
此值允许应用程序根据需要处理空白。如果不包含 xml:space 属性,结果与使用 default 值相同。preserve
此值指示应用程序按原样保留空白,暗示空白可能有含义。
xml:space 属性的值应用于包含该属性的元素的所有子代,但由一个子元素覆盖时除外。
例如,下列文档指定相同的空白行为。
<poem xml:space="default">
<author>
<givenName>Alix</givenName>
<familyName>Krakowski</familyName>
</author>
<verse xml:space="preserve">
<line>Roses are red,</line>
<line>Violets are blue.</line>
<signature xml:space="default">-Alix</signature>
</verse>
</poem>
和:
<poem xml:space="default">
<author xml:space="default">
<givenName xml:space="default">Alix</givenName>
<familyName xml:space="default">Krakowski</familyName>
</author>
<verse xml:space="preserve">
<line xml:space="preserve">Roses are red,</line>
<line xml:space="preserve">Violets are blue.</line>
<signature xml:space="default">-Alix</signature>
</verse>
</poem>
在两个示例中,均通知应用程序必须保留诗行中的所有空白,但是文档其他部分的空白可以根据需要处理。
与其指示语言的对应属性 xml:lang 类似,如果在验证环境中使用,xml:space 属性必须在文档类型定义 (DTD) 中声明。不需要声明 xml 命名空间,因为 XML 规范保留了该命名空间。
默认情况下,Microsoft XML 核心服务 (MSXML) 不接受 xml:space 属性。如果应用程序必须接受 xml:space 属性,在分析之前,DOMDocument 对象的 preserveWhiteSpace 属性必须设置为 True。
xmldoc= new ActiveXObject("Msxml2.DOMDocument.5.0");
xmldoc.preserveWhiteSpace = true;
xmldoc.load(url);
MSXML 还提供一些设置,用于将应用程序空白处理委托给分析器。有关更多信息,请参见 MSXML SDK 文档中的“空白和 DOM”主题。
备注
保留空白信息可能会明显增大文档对象模型 (DOM) 树的大小,因为保留元素之间的空白节点会产生额外的开销。
属性中的空白
尽管 XML 处理器保留元素内容中的所有空白,但是通常会将属性值中的空白标准化。制表符、回车符和空格均报告为单个空格。在某些类型的属性中,将删除值主体之前或之后的空白,将值中的空白减小为单个空格。(如果有 DTD,将在所有非 CDATA 类型的属性上进行此删除。)
例如,XML 文档可能包含下列内容:
<whiteSpaceLoss note1="this is a note." note2="this
is
a
note.">
XML 分析器将两个属性值报告为 "this is a note.",将分行符转换为单个空格。
**注意:**MSXML3 中的 DOM 和 SAX 都不对空格进行标准化。MSXML6 中的 DOM 不对空格进行标准化,但是 SAX 进行标准化。
如果文档有 DTD,声明为非 CDATA 类型的属性会删除属性值开头和结尾的空格;值中聚集的所有空白替换为单个空格。如果没有 DTD,分析器将假定所有属性都是 CDATA 类型。
行尾的处理
XML 处理器将字符序列回车换行符 (CRLF) 作为单个 CR 或 LF 字符一样对待。所有此类字符序列均报告为单个 LF 字符。应用程序可以使用适合的行尾约定保存文档。