PHP DOMDocument怎么用 PHP生成和解析XML

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 是树状结构,所有操作都基于节点对象。

  • loadXML() 解析字符串,load() 加载本地文件(注意路径和权限)
  • getElementsByTagName() 快速获取同名元素集合(返回 DOMNodeList
  • getAttribute() 读取属性值;用 nodeValuetextContent 获取文本内容
  • 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 是功能最全的通用选择,兼顾生成、解析、修改和命名空间支持,适合中大型项目和需要稳定维护的代码。