如何去除XML标签间空白?DOMDocument加载保存后仍有空格
嘿,这个问题我之前做XML数字签名的时候也踩过坑!DOMDocument默认的序列化行为有时候会偷偷插入空格,这对签名来说简直是致命的——毕竟签名是基于精确的字节内容,多一个空格都能导致后续验证失败。
先看你的代码问题:你设置了preserveWhiteSpace = false,这能处理加载时原XML里的空白节点,但保存的时候DOMDocument还是可能会在空标签对之间或者XML声明后自动加空格。解决办法很简单,只要再加一行禁用自动格式化的设置就行:
修改后的代码如下:
$file = 'myfile.xml'; $doc = new DOMDocument('1.0', 'utf-8'); $doc->preserveWhiteSpace = false; $doc->formatOutput = false; // 关键:关闭自动格式化输出,避免多余空格 $doc->load($file); echo htmlentities($doc->saveXML()); exit;
这样输出的XML就会变成<?xml version="1.0" encoding="utf-8"?><Esign ver="2.0"></Esign>,完全没有多余的空格了。
另外特意提醒下,做数字签名的场景下,绝对不能开启formatOutput = true——哪怕是为了可读性也不行,格式化后的空格、换行都会改变XML的字节内容,直接导致签名验证不通过。如果需要调试查看XML结构,可以单独复制一份来格式化,用于签名的版本必须保持严格的无冗余空白状态。
内容的提问来源于stack exchange,提问作者codex




