XML中换行和空格默认保留,但是否视为有意义空白取决于解析器及xml:space属性;该属性取值default(按默认规则处理)或preserve(强制保留所有空白),具继承性,仅作用于字符数据中的空白。

XML 中的换行和空格默认是**保留的**,但具体是否被应用程序当作有意义的空白(比如排版、缩进)来处理,取决于解析器行为和 xml:space 属性的设置。
xml:space 属性的作用
xml:space 是一个标准 XML 属性,用于显式告诉 XML 处理器:当前元素及其子元素中的空白字符(空格、制表符、换行)是否应被“保留”或“忽略”。它只有两个合法值:
- default:按处理器默认规则处理空白(多数解析器会**保留所有空白**,但某些应用层逻辑可能后续过滤)
- preserve:强制保留所有空白字符,包括换行、缩进、多个连续空格
什么时候需要显式设置 xml:space="preserve"
当你的 XML 内容本身依赖格式(比如诗歌、代码片段、预格式化文本),而下游程序(如 XSLT 转换、浏览器渲染、富文本编辑器导入)可能默认压缩或丢弃换行时,就需要用它。
例如:
春风又绿江南岸,
明月何时照我还?
这样,XSLT 或 CSS white-space: pre 渲染时就能正确显示缩进和换行。
xml:space 的作用范围和继承性
xml:space 具有**继承性**:在一个元素上设为 preserve,它的所有子元素也默认继承该行为,除非子元素显式覆盖为 default。
注意:xml:space 只影响**字符数据(#PCDATA)中的空白**,不影响元素标签之间的空白(即“标记外空白”),后者通常由解析器决定是否保留在 DOM 树中(如 Python 的 xml.etree.ElementTree 默认会丢弃)。
实际开发中的常见处理建议
- 不要依赖缩进来表达结构——XML 结构靠嵌套元素,不是空格
- 如果内容含多行文本(如
),且需保留换行,加xml:space="preserve" - 用 XSLT 处理时,
可全局去除指定元素的空白,与xml:space配合使用更灵活 - 在 JSON 转 XML 或生成 XML 的代码中(如 Java JAXB、Python lxml),检查是否自动添加了换行缩进——这些属于序列化格式控制,和
xml:space无关










