PHP DOMDocument 操作 XML 完整指南

南乔
南乔
发布时间:2026-10-15 | 4人浏览过
原创

在 PHP 开发中,处理 XML 数据常需解析结构、提取信息或生成文档。本文将演示如何使用 DOMDocument 类完成从加载、读取到修改保存的全流程操作,涵盖节点遍历、属性更新、元素增删及 XPath 查询等核心功能。

理解 XML 基础概念与工具选择

XML(可扩展标记语言)由多个部分组成,在处理时需明确不同层级:

1. 节点(Node):广义概念,包含元素、属性、文本、注释等所有独立部分。
2. 元素(Element):<xxx></xxx> 形式的标签,通常拥有最丰富的操作方法集。
3. 属性(Attribute):位于尖括号内键值对,如 name="value"。
4. 转义字符:特殊符号需转义后方可作为内容使用。

PHP 提供了多种 XML 处理方式,其中 DOMDocument 对象提供了完善的 DOM 接口,支持标准的 CRUD 操作,适合对结构有精细控制需求的场景。

准备示例数据与环境

为便于演示,以下是一组书籍信息的 XML 数据结构:

<?xml version="1.0"?>
<books>
    <book name="JavaScript: The Definitive Guide" publisher="O'Reilly Media, Inc.">
        <author>David Flanagan</author>
    </book>
    <book name="PHP and MySQL Web Development" publisher="Perason Education">
        <author>Luke Welling</author>
        <author>Laura Thomson</author>
    </book>
</books>

第1步:加载 XML 文件

在使用任何方法前,必须先实例化 DOMDocument 对象并将 XML 文件载入内存。

$path = $_SERVER["DOCUMENT_ROOT"].'/books.xml';
$books = new DOMDocument();
$books->load($path);

参数说明:load() 接收文件路径或 URL;若未传入,后续将无法获取节点树。

第2步:读取/遍历节点与属性

通过 getElementsByTagName 筛选指定标签,随后遍历其下的属性与子节点。

$bookElements = $books->getElementsByTagName('book');
foreach ($bookElements as $book) {
    // 遍历该 book 的所有属性
    foreach ($book->attributes as $attr) {
        echo strtoupper($attr->nodeName) . ' —— ' . $attr->nodeValue . '
'; } // 遍历子元素 author echo "AUTHOR: "; foreach ($book->getElementsByTagName('author') as $author) { echo $author->nodeValue . ' '; } echo '

'; }

精准定位单一节点

若只需读取索引位置确定的属性,可结合 item(index) 方法:

// 打印第二个属性的值
echo $book->attributes->item(1)->nodeValue;

第3步:使用 XPath 增强查询能力

对于复杂的条件过滤,直接使用原生 API 可能较为繁琐,此时可利用 XPath 引擎快速定位符合条件的节点集,大幅提升处理效率。

第4步:修改节点与属性

直接修改 DOM 树中的属性值后,必须调用 save() 将变更写回磁盘。修改可通过直接赋值 nodeValue 或 setAttribute 完成:

foreach($bookElements as $book){
    foreach ($book->attributes as $attr) {
        // 方式一:直接修改节点值
        $attr->nodeValue = strtoupper($attr->nodeValue);
        // 方式二:使用 setAttribute (效果相同)
        // $book->setAttribute($attr->nodeName, $attr->nodeValue);
    }
    // 子元素同样可直接赋值
    foreach ($book->getElementsByTagName('author') as $author) {
        $author->nodeValue = strtoupper($author->nodeValue);
    }
}
$books->save($path); // 关键:保存更改至文件

第5步:添加新元素/属性

构建新节点并插入原有树结构中时,需遵循“先创建子项,再追加父级”的逻辑:

$newBook = $books->createElement('book'); # 创建新元素节点
$newBook->setAttribute('name', 'PHP Objects, Patterns, and Practice'); # 属性方法一

$publisher = $books->createAttribute('publisher'); # 创建属性节点
$publisher->nodeValue = 'Apress L.P';
$newBook->appendChild($publisher); # 把属性挂到元素上

$author = $books->createElement('author'); # 创建作者子元素
$author->nodeValue = 'Matt Zandstra';
$newBook->appendChild($author); # 把作者挂到书名上

// 将整棵新书挂载到根目录
$books->documentElement->appendChild($newBook);
$books->save($path);

第6步:删除属性/节点

移除不需要数据同样需要先找到目标节点,调用相应的 remove 方法后立即保存:

$first = $bookElements->item(0);
$first->removeAttribute('publisher'); # 仅删除第一个书的 publisher 属性

$second = $bookElements->item(1);
$second->parentNode->removeChild($second); # 彻底删除整本书节点

$books->save($path);

总结

掌握 DOMDocument 是处理结构化配置或数据交换的关键技能。核心要点包括:初始化加载、利用标签名或 XPath 遍历树、针对 nodeValue 或 setAttribute 进行修改,以及最后务必执行 save() 持久化结果。以上就是使用 PHP DOMDocument 操作 XML 的详细内容,更多关于 PHP XML 编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表