DOMDocument是PHP操作XML/HTML的标准可靠方式,支持解析、遍历、修改、创建和保存;需注意编码匹配、错误抑制、节点归属及格式化输出等细节。

PHP 的 DOMDocument 类是操作 XML(和 HTML)文档最标准、最可靠的方式之一。它基于 W3C DOM 标准,支持解析、遍历、修改、创建和保存 XML 文档,适合处理结构清晰、需要严格校验或复杂操作的 XML 场景。
加载 XML:从字符串或文件读取
用 loadXML() 解析 XML 字符串,用 load() 读取外部 XML 文件。注意编码问题——默认按 UTF-8 解析,若 XML 声明中指定了其他编码(如 encoding="GB2312"),需确保字符串本身编码匹配,否则可能报错或乱码。
- 从字符串加载:
$doc = new DOMDocument(); $doc->loadXML($xmlString); - 从文件加载:
$doc->load('data.xml'); - 加载前可关闭警告避免干扰:
libxml_use_internal_errors(true);,之后用libxml_get_errors()检查错误
查找节点:用 getElementsByTagName 或 XPath
getElementsByTagName() 最常用,返回 DOMNodeList 对象,支持标签名匹配(不区分命名空间)。对复杂查询(如属性过滤、层级关系、条件判断),推荐搭配 DOMXPath 使用,更灵活精准。
- 获取所有
元素:$items = $doc->getElementsByTagName('item'); - 用 XPath 查找带属性的节点:
$xpath = new DOMXPath($doc); $nodes = $xpath->query("//book[@category='web']"); - 遍历结果时注意:
DOMNodeList是实时集合,动态修改 DOM 可能影响后续遍历,建议先转为数组或反向遍历
修改与创建节点:安全添加、更新、删除
新增节点必须通过文档对象创建(如 createElement()、createTextNode()),再用 appendChild()、insertBefore() 等方法挂载。直接拼接字符串写入会破坏 DOM 结构,且无法触发内部校验。
立即学习“PHP免费学习笔记(深入)”;
- 添加子元素:
$newNode = $doc->createElement('price', '99.00'); $book->appendChild($newNode); - 设置属性:
$node->setAttribute('id', 'b101'); - 删除节点:
$node->parentNode->removeChild($node);(不能直接调用$node->remove(),该方法 PHP 8.0+ 才支持)
输出与保存:格式化与编码控制
saveXML() 返回字符串,save() 直接写入文件。默认输出无缩进,可通过设置 $doc->formatOutput = true; 启用自动缩进;若需指定编码,应在 XML 声明中体现,并确保输出时使用对应编码(如 UTF-8)。
- 美化输出:
$doc->formatOutput = true; $doc->preserveWhiteSpace = false; - 生成带声明的 XML:
echo $doc->saveXML(null, LIBXML_NOEMPTYTAG); - 保存到文件:
$doc->save('output.xml');(注意目标目录需有写权限)
DOMDocument 功能完整但稍重,适合中大型 XML 处理任务。小数据量或只读场景可考虑 SimpleXML,更简洁;高频读写或内存敏感环境要注意节点引用和垃圾回收。不复杂但容易忽略细节,比如编码一致性、错误抑制、节点归属文档等。











