DOMDocument 是 PHP 处理 XML/HTML 的标准类,需注意编码一致、空白节点处理及错误屏蔽:加载前设 preserveWhiteSpace=false、libxml_use_internal_errors(true),显式指定 encoding;保存时启用 formatOutput=true 可格式化输出。

PHP 的 DOMDocument 类是处理 XML(和 HTML)最常用、最标准的方式。它基于 W3C DOM 规范,支持加载、解析、修改和保存 XML 文档。关键在于:加载要处理编码和错误,保存要注意格式化和编码一致性。
加载 XML 文件或字符串
用 load() 加载文件,loadXML() 加载字符串。默认会解析 DTD 并报告警告(比如编码不匹配、标签未闭合),建议提前配置错误处理:
- 调用
libxml_use_internal_errors(true)屏蔽警告,避免因非致命问题中断执行 - 设置
$doc->encoding = 'UTF-8'显式声明编码(尤其对无声明的 XML) - 若 XML 声明中指定了
encoding="GBK",需确保源内容真实为 GBK,否则解析可能乱码
示例:
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->encoding = 'UTF-8';
if (!$doc->load('data.xml')) {
echo "加载失败:" . implode(', ', libxml_get_errors());
}
?>
加载时跳过空白文本节点(让结构更干净)
XML 中换行和缩进会被解析为 DOMText 节点,干扰遍历。可在加载前启用 preserveWhiteSpace = false:
立即学习“PHP免费学习笔记(深入)”;
- 必须在
load()或loadXML()之前设置,之后设置无效 - 它只影响“纯空白”文本节点(全空格/换行),不会删掉元素内有意义的空格
示例:
$doc = new DOMDocument();$doc->preserveWhiteSpace = false;
$doc->loadXML('
保存 XML 到文件或字符串
用 save() 写入文件,saveXML() 返回字符串。注意三点:
-
saveXML()默认输出整个文档,加参数如$doc->saveXML($node)可只输出某个子节点 - 若希望输出带缩进的可读格式,启用
formatOutput = true(但会自动添加换行和空格) - 保存的编码由
$doc->encoding决定,且 XML 声明中的 encoding 属性也会被同步更新
示例(保存为缩进 UTF-8):
$doc->formatOutput = true;$doc->encoding = 'UTF-8';
$doc->save('output.xml'); // 自动写入
常见坑与应对
实际使用中容易卡在这几个地方:
-
中文乱码:确认源 XML 编码声明、文件真实编码、
$doc->encoding三者一致;读取后可用mb_detect_encoding()辅助判断 -
无法加载远程 URL:
allow_url_fopen关闭时load()会失败,改用file_get_contents()+loadXML() -
保存后丢失 CDATA 或特殊字符:DOM 默认会转义,若需保留原始内容,用
createCDATASection()显式创建节点
基本上就这些。DOMDocument 不复杂但容易忽略细节,把编码、空白、错误处理这三块理清楚,日常 XML 操作就稳了。











