
php 使用 `header('content-type: application/xml')` 时,浏览器会严格校验全部响应内容为合法 xml;若混入非 xml 文本(如调试提示),将导致解析失败并报错“document is empty”。解决方法是分离内容类型或分段输出。
在 PHP 中通过 DOMDocument::saveXML() 生成 XML 并直接输出到浏览器时,HTTP 响应头(Content-Type)决定了浏览器如何解析后续所有响应体内容。当你设置:
header("content-type:application/xml; charset=ISO-8859-15");浏览器即以 XML 解析器加载整页响应——此时任何非格式化 XML 的内容(例如 "Saving only the title part:\n" 这类纯文本)都会破坏 XML 结构,导致解析器在第 1 行第 1 列报错:Document is empty 或 Invalid document structure。
✅ 正确做法是:根据实际输出内容选择匹配的 MIME 类型。若需混合输出说明文字与 XML 片段(如调试场景),应改用 text/plain:
formatOutput = true;
$doc->preserveWhiteSpace = false;
$root = $doc->appendChild($doc->createElement('book'));
$title = $root->appendChild($doc->createElement('title'));
$title->appendChild($doc->createTextNode('This is the title'));
echo "Saving only the title part:\n";
echo $doc->saveXML($title); // 输出:This is the title
?>⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- saveXML($node) 仅序列化指定节点及其子树,不包含 XML 声明(如 ),也不保证根节点唯一性(可能输出多个同级
)。若需完整文档,请调用 $doc->saveXML()(无参数)。 - 若必须以 application/xml 响应(如供其他系统消费),则严禁在 XML 内容前/后插入任何额外字符(包括空格、换行、echo 文本)。调试信息应改用 error_log() 或注释方式处理。
- 字符编码需前后一致:DOMDocument 构造时指定的编码(如 'ISO-8859-15')应与 header() 中声明的 charset 完全匹配,否则可能引发乱码或解析异常。
? 总结:XML 输出不是“打印字符串”,而是交付一个结构化文档。保持 Content-Type 与响应体语义严格一致,是避免浏览器解析错误的根本原则。调试阶段优先用 text/plain;生产环境交付 XML 时,确保响应体 100% 纯 XML 且无前置输出。











