空白
万维网联合会 (W3C) XML 规范使不同的行尾约定标准化为一个约定,但是保留所有其他空白(属性值中除外)。 XML 还提供一组工具,文档可以使用这些工具来通知应用程序是否必须保留空白。
空白和 XML 声明
根据当前的 XML 1.0 标准,在 XML 声明之前不允许包含空白。
如果在 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
属性的值应用于包含该属性的元素的所有子代,但由一个子元素覆盖时除外。
例如,下列文档指定相同的空白行为。
和:
在两个示例中,均通知应用程序必须保留诗行中的所有空白,但是文档其他部分的空白可以根据需要处理。
与其指示语言的对应属性 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 字符。 应用程序可以使用适合的行尾约定保存文档。