XML作为常用的数据交换格式,对空格的处理有一套独立的规则,很多开发者在解析或生成XML文档时,都会遇到空格不符合预期的情况,了解其处理机制能有效避免相关问题。

XML空格的基础规则
XML规范中,空格属于空白字符的一种,空白字符包含空格、制表符、换行符、回车符。在XML解析器解析文档时,默认会对元素内容中的空白字符做特殊处理,具体规则由解析器的配置和XML文档的声明共同决定。
需要注意的是,XML属性值中的空格默认会被保留,但是属性值前后的空格会被解析器自动忽略,例如<node attr=" test ">解析后attr属性的值为"test",前后的空格会被剔除。
默认情况下空格的处理逻辑
当XML文档没有特殊声明时,大多数非验证型解析器会忽略元素内容中仅包含空白字符的文本节点,也就是如果元素内容只有空格、换行、制表符,这些内容会被解析器直接丢弃。
比如下面的XML片段:
<user>
<name>张三</name>
<age>20</age>
</user>
解析器解析<user>元素时,<name>标签前后的换行和缩进空格,默认会被当作无意义的空白字符忽略,不会生成对应的文本节点。
保留XML中的空格的方法
使用xml:space属性
XML提供了内置的xml:space属性,用来显式声明元素内空格的处理规则,该属性有两个可选值:
- default:默认值,解析器可以按照自己的规则处理元素内的空白字符,通常就是忽略无意义空白。
- preserve:要求解析器必须保留元素内的所有空白字符,不能做任何修改。
示例代码如下:
<content xml:space="preserve">
这是一段
包含换行的
文本内容
</content>
此时解析器会完整保留<content>元素内的所有空格、换行,不会做任何剔除或合并操作。
使用CDATA段
如果一段内容中包含大量需要保留的空格、特殊字符,也可以使用CDATA段来包裹内容,CDATA段内的所有内容都会被解析器当作纯文本处理,不会解析其中的任何XML标记,空格也会原封不动保留。
示例代码如下:
<code_block>
<![CDATA[
public static void main(String[] args) {
System.out.println("Hello World");
}
]]>
</code_block>
上面的代码中,CDATA段内的缩进、换行空格都会被完整保留,不会被解析器修改。
不同解析场景下的处理示例
下面以Python的xml.dom.minidom解析器为例,展示不同配置下空格的处理差异:
from xml.dom import minidom
# 待解析的XML内容
xml_content = """<root>
<item xml:space="preserve"> a b </item>
<item> a b </item>
</root>"""
# 解析XML
doc = minidom.parseString(xml_content)
root = doc.documentElement
items = root.getElementsByTagName("item")
for item in items:
# 获取元素的文本内容
text = item.firstChild.nodeValue
print(f"元素xml:space属性: {item.getAttribute('xml:space')}")
print(f"文本内容: '{text}'")
print("-" * 30)
运行上述代码后,第一个设置了xml:space="preserve"的item,文本内容会完整保留前后的空格,第二个没有设置的item,文本内容中的多余空格可能会被合并,具体表现和解析器的实现有关。
注意事项
- xml:space属性是继承的,如果一个父元素设置了
xml:space="preserve",其所有子元素默认都会继承这个规则,除非子元素单独设置了自己的xml:space属性。 - 不同的XML解析器对默认空格的处理可能存在细微差异,开发时如果需要严格保留空格,建议显式使用xml:space="preserve"或者CDATA段,不要依赖解析器的默认行为。
- 生成XML文档时,如果需要保留空格,输出内容时不要自动格式化添加额外的缩进和换行,避免引入不必要的空白字符。
XML空格处理XML_parserwhitespaceCDATA修改时间:2026-07-16 12:09:11