xml:space属性用于显式控制元素及其子元素内空白字符的处理方式,取值default(合并连续空白)或preserve(严格保留所有空白),具有继承性,仅影响字符数据,不作用于属性值。

XML 中的空白字符(空格、制表符、换行)默认会被解析器“保留但不显著”,具体是否保留、是否影响内容,取决于元素用途和解析器行为。而 xml:space 属性就是用来**显式控制某个元素及其子元素内空白字符的处理方式**的标准机制。
xml:space 属性的两个合法值
xml:space 是一个预定义的 XML 属性(属于 XML 命名空间),只能取以下两个值之一:
-
default:表示遵循解析器的默认规则——通常会**合并连续空白(如多个空格变一个,换行/制表符可能被转为空格或忽略)**,适用于大多数结构化内容(如
<name> John Doe </name>解析后常为"John Doe")。 - preserve:表示**严格保留所有空白字符原样**(包括开头空格、缩进、换行、制表符),适用于需要格式精确的内容,比如代码块、诗歌、配置文本等。
作用范围是当前元素及其所有后代元素
xml:space 具有继承性。一旦在某个元素上声明,它会影响该元素内部的所有文本节点(包括嵌套子元素中的文本),除非子元素显式覆盖该属性。
例如:
Roses are red,
Violets are blue.
其中的缩进空格和换行都会被保留;但如果在 <poem></poem> 内部某处写 <line xml:space="default">...</line>,那该 <line></line> 内的空白就会按默认方式处理。
实际使用注意事项
- 不能用于属性值内部:xml:space 只影响元素的字符数据(#PCDATA),对属性值里的空白无影响(属性值中的空白始终按规范归一化:首尾截断、中间多个空白压缩为单个空格)。
- 解析器必须支持才生效:主流解析器(如 Java 的 DOM/SAX、Python 的 lxml、.NET 的 XmlReader)都支持,但需确保解析时未禁用命名空间或忽略 xml:* 属性。
- 不是“美化输出”的开关:它不控制序列化时是否加缩进,只控制解析阶段如何对待输入中的空白;输出格式由序列化器单独决定。
-
与 CSS white-space 无关:这是纯 XML 解析层语义,和 HTML/CSS 渲染无关;若用 XSLT 转成 HTML,需额外用
white-space: pre等样式来呈现保留的换行。
什么时候该用 preserve?
典型场景包括:
- 嵌入源代码片段:
<code xml:space="preserve">for (int i=0; i System.out.println(i); - 多行地址或诗歌:
<address xml:space="preserve">123 M<a style="color:#f60; text-decoration:underline;" title="ai" href="https://www.php.cn/zt/17539.html" target="_blank">ai</a>n St.<br>Apt 4B<br>New York, NY</address> - 需要逐字比对的协议文本或日志片段。
其余多数情况(如人名、标题、描述性文字)用默认行为更自然,避免因意外缩进导致数据异常。










