很多人在处理XML文件时都会遇到一个问题:我在文本里加的空格,到底会不会被保留?比如写配置、传数据的时候,多打了个空格,系统会不会出问题?其实这个问题没那么玄乎,搞清楚规则就好办。
XML默认会保留空白字符
和HTML不一样,XML对空格是认真的。你在标签之间、属性值里写的空格、换行、制表符(Tab),只要不是特意压缩处理,解析器都会原样保留。比如下面这段:
<message>
<content> 用户名不能为空 </content>
</message>
这里的 <content> 标签前后各有两个空格,中间还有换行和缩进。XML解析器读到的内容就是带这些空白的,不会自动去掉。
但有些情况会被“忽略”
说“忽略”其实不太准确,更确切地说是某些解析方式或工具做了额外处理。比如用DOM解析时,默认可能会把纯由空白组成的文本节点保留,但如果你用了简化模式或设置了 ignoreWhitespace,那这些只包含空格、换行的节点就会被跳过。
再比如,很多开发用的框架在读取XML配置时,为了方便,会自动 trim 字符串值。像Spring读取bean的property,即使你写的是 <value> admin </value>,它也会帮你去掉首尾空格。这不是XML本身的行为,而是上层代码做的处理。
属性值里的空格也要小心
属性值中的空格同样会被保留。比如:
<user role=" admin,user " name="张三" />
这个 role 的值前后都有空格,实际拿到的就是 admin,user 。如果后面做角色判断时没trim,就可能匹配不上 admin,导致权限出错。这种bug查起来挺头疼,往往是因为看着“差不多”,结果程序就是不认。
想控制空白?得自己动手
如果你真需要统一处理空格,可以在代码里显式处理。比如Java里用 .trim() 去掉首尾空格,或者用正则替换多个空格为一个。另外,XSD(XML Schema)也能定义字段是否要保留空白,通过 whiteSpace 约束来控制,不过这属于进阶用法了。
日常写配置、传数据时,别依赖XML自动清理空格。该trim的地方手动处理一下,省得后面踩坑。