DOMDocument 是 PHP 处理 XML 最标准可靠的方式,支持生成、解析、修改及命名空间操作。其核心流程为:新建文档→创建根节点→追加子节点→设置属性和文本→输出或保存;解析时需加载源→定位节点→提取内容或属性,并注意编码、命名空间及错误处理等细节。

PHP 的 DOMDocument 是处理 XML 最标准、最可靠的方式之一,既能生成结构清晰的 XML,也能安全解析外部或本地 XML 数据。它基于 W3C DOM 标准,操作直观,容错性强,适合大多数实际场景。
用 DOMDocument 生成 XML
创建 XML 文档的核心是:新建文档 → 创建根节点 → 追加子节点 → 设置属性和文本内容 → 输出或保存。
- 先实例化
DOMDocument,可指定版本和编码(推荐显式声明) - 用
createElement()创建元素节点,createTextNode()创建文本内容 - 用
appendChild()或insertBefore()组织层级关系 - 用
setAttribute()添加属性,支持命名空间(如setAttributeNS()) - 调用
saveXML()获取字符串,save()直接写入文件(含 BOM 风险,注意编码)
示例:生成一个带属性和嵌套结构的简单配置 XML
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->formatOutput = true; // 自动缩进,便于阅读
$root = $doc->createElement('config');
$doc->appendChild($root);
$app = $doc->createElement('app');
$app->setAttribute('env', 'production');
$app->appendChild($doc->createElement('name', 'MyApp'));
$app->appendChild($doc->createElement('version', '2.3.1'));
$root->appendChild($app);
echo $doc->saveXML(); // 输出格式化后的 XML 字符串
用 DOMDocument 解析 XML
解析的关键在于:加载 XML 源(字符串或文件)→ 定位目标节点 → 提取内容或属性。DOM 是树状结构,所有操作都基于节点对象。
立即学习“PHP免费学习笔记(深入)”;
- 用
loadXML()解析字符串,load()加载本地文件(注意路径和权限) - 用
getElementsByTagName()快速获取同名元素集合(返回DOMNodeList) - 用
getAttribute()读取属性值;用nodeValue或textContent获取文本内容 - 用
getElementsByTagNameNS()处理带命名空间的 XML(如 SOAP、Atom) - 开启
libxml_use_internal_errors(true)可屏蔽解析错误并手动捕获,避免警告打断流程
示例:解析上面生成的 XML 字符串
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadXML($xmlString); // $xmlString 来自上例
$apps = $doc->getElementsByTagName('app');
if ($apps->length > 0) {
$app = $apps->item(0);
echo "环境:" . $app->getAttribute('env') . "\n";
echo "名称:" . $app->getElementsByTagName('name')->item(0)->textContent . "\n";
}
常见问题与注意事项
DOMDocument 功能强大,但几个细节容易踩坑:
- 默认不处理 UTF-8 中文时可能乱码:务必在构造时指定编码,且确保输入 XML 声明一致(如
) - 解析 HTML 片段会失败:DOMDocument 是 XML 解析器,非 HTML;若需解析 HTML,改用
DOMDocument::loadHTML()并配合libxml_use_internal_errors() - 节点追加后原变量仍有效:DOM 节点是引用类型,
appendChild()不会销毁源节点,可复用 -
内存占用相对高:对超大 XML(百 MB 级),考虑
XMLReader流式解析替代
替代方案简要对比
不是所有场景都必须用 DOMDocument:
-
SimpleXML:语法更简洁,适合读多写少、结构固定的 XML;但修改能力弱,不支持命名空间高级操作 -
XMLReader:只读、低内存、流式解析,适合处理大型 XML 文件 -
XMLWriter:专为高效生成 XML 设计,API 更轻量,但不提供节点查询能力
DOMDocument 是功能最全的通用选择,兼顾生成、解析、修改和命名空间支持,适合中大型项目和需要稳定维护的代码。











