XML 格式化后空格变了?混合文本与 xml:space 的使用边界
XML 校验通过,不代表格式化前后的每个文本字符都相同。只含配置节点的文档通常更关注层级,但一句话中夹着子标签,或字段本来就依赖首尾空格时,格式化和压缩可能改变业务需要的内容。
宝塔拨测的“XML格式化”可以整理文本。下面用四次实际操作说明当前页面怎样处理空白,帮助判断哪些结果可以拿来阅读,哪些不应直接覆盖原文件。
混合内容会被拆成多行
打开“XML格式化”,先保留原始内容,再把下面一行粘贴到输入区,点击“校验 / 格式化”:
<p>alpha <b>beta</b> gamma</p>
这段内容在同一个 p 元素中交替出现文字和 b 子元素,属于混合内容。alpha 后、gamma 前各有一个空格,它们本来就在文本节点里。

本次输出加入了 XML 声明,并把 alpha、<b>beta</b>、gamma 分别放到新行。原来紧邻文字的空格没有按原样保留,新的换行和缩进进入了元素内容。它更便于查看层级,但已经不能称为逐字不变的文本整理。
如果这是一段供程序显示、比较或拼接的正文,应比较转换前后的文本内容,而不只看标签是否还在。某些展示环境可能把连续空白折叠,让它们看起来接近;这仍然不能说明文件中的字符没有变化,也不能保证其他读取方式得到相同结果。
xml:space="preserve" 也需要实测核对
再输入下面的测试,注意 keep 元素里 alpha 前有两个空格,beta 后也有两个空格:
<root><keep xml:space="preserve"> alpha beta </keep><line> A </line></root>
点击“校验 / 格式化”。本次输出中的对应部分变成:
<keep xml:space="preserve">alpha beta</keep>
<line>A</line>

alpha 与 beta 之间的三个空格还在,keep 两端的空格却被移除了,line 中的 A 也变成了 A。这说明当前格式化结果没有按照这个例子的保留意图完整保留空白。属性还留在文档里,并不能证明它要求保留的字符也还在。
XML 规范中的 xml:space 用于表达空白处理意图。对于必须保留缩进的代码、诗歌、固定宽度字段或其他空格敏感内容,不要仅靠加上这个属性,再让当前工具覆盖原稿。应保留原文件,用能核对文本节点的流程检查后再决定是否采用结果。
压缩也不能当成空白无损处理
重新粘贴第一组混合文本,点击“压缩”。本次它仍然是下面这一行,两个文字分隔空格没有被移除:
<p>alpha <b>beta</b> gamma</p>

但换成下一个输入,结果就不同了:
<root xml:space="preserve"><a/> <b/></root>
点击“压缩”后,两个子元素之间的三个空格被删除,实际结果为 <root xml:space="preserve"><a/><b/></root>。

这两次结果说明,压缩对不同位置的空白处理并不相同。第一组文字分隔还在,不能推导出所有空白都安全;第二组带有 preserve,也没有阻止标签之间的纯空白被移除。
怎样把工具用于阅读和排查
只想查看一份配置的层级时,可以在副本中格式化,沿着父子标签阅读。准备回写时,再检查值里是否存在前导空格、尾随空格、混合内容或 xml:space。有这些内容的文档,应重点比较文本节点,而不只是标签数量和校验状态。
若已经先格式化,再压缩,压缩不会替你找回之前移除的首尾空格;输入框里的当前内容已经是处理过的版本。最稳妥的操作是让原文件一直保留,确认目标程序需要的值与空白都一致后,再使用转换结果。当前页面适合帮助阅读结构,涉及空白精确保留时,应按上述实测边界选择处理流程。