导读:本期聚焦于小伙伴创作的《XML中的空格处理规则有哪些?详细介绍XML中空格的完整处理方式》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《XML中的空格处理规则有哪些?详细介绍XML中空格的完整处理方式》有用,将其分享出去将是对创作者最好的鼓励。

XML中的空格处理是很多开发者在解析和生成XML数据时容易踩坑的点,不同的处理逻辑会导致最终获取到的内容出现差异,影响数据的准确性。空格在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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。