PHP的DOMDocument是什么 如何用它来创建和修改XML
技术百科
幻夢星雲
发布时间:2026-01-15
浏览: 次 DOMDocument是PHP操作XML/HTML的核心类,基于libxml将文档解析为内存树状结构,需显式设置encoding和version,加载用loadXML(),跨文档操作须importNode()或adoptNode(),修改文本用textContent或createTextNode(),调试需启用libxml_use_internal_errors()。
DOMDocument 是 PHP 里的 XML/HTML 文档操作核心类
它不是简单的字符串处理工具,而是把 XML 解析成内存中的树状结构(DOM),让你能像操作网页 DOM 一样增删改查节点。底层基于 libxml,所以对格式错误敏感——比如没闭合的标签、编码不匹配、BOM 头,都会直接报错或静默失败。
创建 XML 文档时必须显式设置 encoding 和 version
不设 encoding 容易在输出中文时变成乱码;不设 version 可能导致某些老系统解析异常。创建后立即调用 formatOutput = true 才能生成可读缩进,否则所有内容挤在一行。
-
DOMDocument构造时不接受 encoding 参数,得用saveXML()的第二个参数或手动写声明 - 推荐写法:
$doc = new DOMDocument('1.0', 'UTF-8'); $doc->formatOutput = true; - 如果已有 XML 字符串要加载,优先用
loadXML()而非load(),后者默认按文件路径处理
添加节点前必须用 importNode() 或 adoptNode() 跨文档转移
常见错误:从一个 DOMDocument 中取节点,直接 appendChild() 到另一个文档,会报 “Wrong Document Error”。因为每个节点绑定所属文档上下文,不能硬塞。
- 复制节点用
$newDoc->importNode($oldNode, true)(true表示深拷贝) - 移动节点用
$newDoc->adoptNode($oldNode)(原节点从旧文档中移除) - 新建元素统一走
createElement()/createElementNS(),别用字符串拼接

修改属性和文本内容要区分 setAttribute() 和 textContent
setAttribute() 只改 attribute,textContent 替换全部子文本节点(包括注释和 CDATA),而 nodeValue 在元素节点上返回 null —— 这点容易踩坑。
- 改属性:
$element->setAttribute('id', 'user-123'); - 改纯文本内容(清空原有子节点,插入新文本):
$element->textContent = '张三';
- 追加文本节点(保留原有子节点):
$textNode = $doc->createTextNode('(管理员)'); $element->appendChild($textNode); - 读取属性值用
$element->getAttribute('id'),不是$element->id
libxml_use_internal_errors(true) 并用 libxml_get_errors() 捕获具体哪一行坏了。
# 让你
# 加载
# 已有
# 文档
# 第二个
# app
# 工具
# Error
# html
# 编码
# xml
# 字符串
# 报错
# 行号
# node
# NULL
# 命名空间
# bom
# php
# 树状
# Attribute
# dom
# 会报
# 不设
# Libxml
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么打开注册表_Windows 11注册
- Win11怎么设置按流量计费_Win11限制后台流
- PHP主流架构如何处理会话管理_Session与C
- Linux如何安装Tomcat应用服务器_Linu
- Windows10如何更改系统字体大小_Win10
- php命令行怎么运行_通过CLI模式执行PHP脚本
- 如何使用Golang实现错误包装与传递_Golan
- 如何使用Golang捕获测试日志_Golang t
- 如何在 ACF 中正确更新嵌套多层的 Group
- XAMPP 启动失败(Apache 突然停止)的终
- 如何使用Golang实现多重错误处理_Golang
- 如何使用Golang反射创建map对象_动态生成键
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- php增删改查需要哪些扩展_开启mysqli或pd
- Windows11如何设置专注助手_Windows
- 如何使用Golang写入二进制文件_Golang
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Win11如何开启telnet服务 Win11启用
- c# Task.Yield 的作用是什么 它和Ta
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Win11怎么关闭系统推荐内容_Windows11
- php订单日志怎么导出excel_php导出订单日
- Windows执行文件被SmartScreen拦截
- c++的static关键字有什么用 静态变量和静态
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Python变量绑定机制_引用模型解析【教程】
- Win11如何设置自动关机 Win11定时关机命令
- php订单日志怎么记录发货_php记录订单发货操作
- c++中如何计算坐标系中两点间距离_c++勾股定理
- Win11时间不对怎么同步_Win11自动校准互联
- PHP cURL GET请求:正确设置请求头与身份
- Win10怎样安装Word样式库_Win10安装W
- Win10如何关闭安全中心所有通知 Win10禁用
- C++友元类使用场景_C++类间协作设计方式讲解
- Win10如何卸载自带Edge_Win10彻底卸载
- 短链接怎么用php还原_从基础原理到代码实现教学【
- PyTorch DDP 多进程训练在 Kaggle
- Win11怎么更改文件夹图标_自定义Win11文件
- Win11此电脑不在桌面上_Windows 11桌
- php能控制zigbee模块吗_php通过串口与c
- Windows10怎样设置家长控制_Windows
- Win11如何关闭小娜Cortana Win11禁
- Python数据挖掘核心算法实践_聚类分类与特征工
- php文件怎么变mp4保存_php输出视频流保存为
- Go 中 defer 语句在 goroutine
- Win11怎么关闭系统透明度_Windows11个
- php打包exe怎么传递参数_命令行参数接收方法【
- Win11怎么设置触控板手势_Windows11三
- Win10电脑怎么设置休眠快捷键_Windows1
- 如何在Golang中实现邮件发送功能_Golang

QQ客服