XML中的空格处理是很多开发者在解析和生成XML数据时容易踩坑的点,不同的处理逻辑会导致最终获取到的内容出现差异,影响数据的准确性。空格在XML中并非都会被同等对待,需要根据具体的规则和属性设置来判断最终的处理结果。

XML中空格的基础定义
在XML规范中,空白字符指的是以下四种字符:空格(#x20)、制表符(#x9)、回车符(#xD)、换行符(#xA)。这些字符在XML文档的不同位置会有不同的默认处理方式,不是所有的空白字符都会被保留到最终的解析结果中。
XML解析器的默认空格处理规则
大部分XML解析器在默认情况下,会对元素内容中的空白字符进行规范化处理,具体规则如下:
- 元素内容开头和结尾的连续空白字符会被移除
- 元素内容中间的多个连续空白字符会被替换成单个空格
- 属性值中的空白字符会被规范化,多个连续空白字符替换为单个空格,开头结尾的空白字符会被移除
我们可以通过一段简单的Java代码来验证默认的处理效果,代码如下:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class XmlSpaceDemo {
public static void main(String[] args) throws Exception {
String xmlContent = "<?xml version="1.0" encoding="UTF-8"?>n" +
"<root>n" +
" <content> 测试 内容 </content>n" +
" <attrTest attr=" 测试 属性 " />n" +
"</root>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 关闭命名空间感知,避免额外影响
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new java.io.ByteArrayInputStream(xmlContent.getBytes("UTF-8")));
// 获取content元素内容
NodeList contentNodes = doc.getElementsByTagName("content");
Element contentElem = (Element) contentNodes.item(0);
String contentText = contentElem.getTextContent();
System.out.println("默认处理的元素内容: [" + contentText + "]");
// 获取attrTest元素的attr属性值
NodeList attrNodes = doc.getElementsByTagName("attrTest");
Element attrElem = (Element) attrNodes.item(0);
String attrValue = attrElem.getAttribute("attr");
System.out.println("默认处理的属性值: [" + attrValue + "]");
}
}
运行上述代码后,输出结果如下:
默认处理的元素内容: [测试 内容] 默认处理的属性值: [测试 属性]
可以看到元素内容开头结尾的空格被移除,中间的多个空格被替换成单个,属性值的处理也符合默认规则。
xml:space属性的用法
如果希望保留元素内容中的原始空格,需要使用XML规范提供的xml:space属性,该属性有两个可选值:
default:使用解析器的默认空格处理规则,也是不设置该属性时的默认行为preserve:要求解析器保留元素内容中的所有空白字符,不做规范化处理
我们修改之前的XML内容,添加xml:space属性,再运行解析代码查看效果:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class XmlSpacePreserveDemo {
public static void main(String[] args) throws Exception {
String xmlContent = "<?xml version="1.0" encoding="UTF-8"?>n" +
"<root>n" +
" <content xml:space="preserve"> 测试 内容 </content>n" +
"</root>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new java.io.ByteArrayInputStream(xmlContent.getBytes("UTF-8")));
NodeList contentNodes = doc.getElementsByTagName("content");
Element contentElem = (Element) contentNodes.item(0);
String contentText = contentElem.getTextContent();
System.out.println("preserve模式的元素内容: [" + contentText + "]");
}
}
运行后的输出结果为:
preserve模式的元素内容: [ 测试 内容 ]
可以看到设置xml:space="preserve"后,元素内容中的原始空格被完整保留,没有做规范化处理。
不同场景下的空格处理建议
在实际开发中,可以根据场景选择合适的空格处理方式:
- 如果XML内容是用来存储结构化数据,不需要保留原始格式,使用默认的空格处理规则即可,减少不必要的空间占用
- 如果XML内容包含需要保留格式的文本内容,比如代码段、预格式化文本,一定要给对应元素添加
xml:space="preserve"属性 - 生成XML时如果需要保留空格,除了设置属性,还要注意转义特殊字符,避免解析出错
注意事项
需要注意xml:space属性只对元素的内容生效,不会影响属性的空格处理,属性值始终会按照默认规则进行规范化。另外,部分轻量级的XML解析库可能不支持xml:space属性,使用时需要提前确认解析器的兼容性。
如果需要在HTML相关的XML应用(如XHTML)中处理空格,还要注意和HTML的空格渲染规则区分开,XML的空格处理是解析阶段的逻辑,和最终渲染阶段的空格处理是独立的。
XML空格处理preserve_whitespacenormalize_whitespaceXML解析修改时间:2026-07-02 12:00:18