如何在 PHP 中从 DOMNodeList 中筛选指定标签名的节点
技术百科
花韻仙語
发布时间:2026-01-27
浏览: 次 domnodelist 本身不支持 getelementsbytagname() 方法,需通过遍历并检查 nodename 属性来实现标签过滤;本文详解错误原因、正确实现方式及更优的 xpath 替代方案。
在 PHP 的 DOM 扩展中,DOMNodeList 是一个只读的节点集合对象(类似数组),它不是 DOM 节点,因此不具备 getElementsByTagName() 这类属于 DOMElement 或 DOMDocument 的方法。你遇到的 Uncaught Error: Call to undefined method DOMNodeList::getElementsByTagName() 正源于此——$related_notions 是 DOMNodeList 实例,而 getElementsByTagName() 只能被调用在单个元素节点(如 DOMElement)或文档根节点上。
✅ 正确做法是:遍历 DOMNodeList,对每个节点单独判断其标签名。你提供的解决方案完全可行:
$index = new DOMDocument();
$index->load('index.xml');
$xpath = new DOMXpath($index);
$related_notions = $xpath->query("/index/notion[name='" . $name . "']/relations/*");
foreach ($related_notions as $item)
{
if ($item instanceof DOMElement && $item->nodeName === 'superordinate') {
// ✅ 安全执行操作(添加 instanceof 检查更健壮)
echo $item->textContent;
}
}⚠️ 注意事项:
- 建议添加 instanceof DOMElement 判断,避免因空白文本节点(DOMText)等非元素节点导致 nodeName 比较异常;
- 直接使用 ===(严格比较)而非 ==,防止类型隐式转换引发意外匹配;
- $name 变量需确保已过滤/转义,否则存在 XPath 注入风险(推荐使用 DOMXPath::evaluate() 配合参数绑定,或先用 htmlspecialchars() 处理,但更佳实践是预编译表达式 + bindValue —— 不过原生 DOM 扩展暂不支持参数绑定,建议改用 addNamespace() + 安全字符串拼接,或升级至支持 PDO 风格绑定的库如 symfony/dom-crawler)。
✨ 更优进阶方案:直接在 XPath 中完成筛选,语义清晰且性能更高(无需 PHP 层遍历):
立即学习“PHP免费学习笔记(深入)”;
// 一次性获取所有符合条件的 superordinate 元素
$superordinates = $xpath->query("/index/notion[name='" . $name . "']/relations/superordinate");
foreach ($superordinates as $item) {
// $item 已确定为 元素
echo $item->getAttribute('id') ?? 'no-id';
} ? 总结:
DOMNodeList 是结果集容器,不可调用节点方法;筛选应优先在 XPath 表达式中完成;若逻辑复杂必须后处理,则务必遍历 + nodeName 判断,并辅以类型校验。掌握这一机制,可显著提升 XML 解析代码的健壮性与可维护性。
# 是一个
# 这类
# 更高
# 这一
# 进阶
# 推荐使用
# 绑定
# 而非
# 不支持
# Error
# 对象
# 隐式转换
# html
# xml
# 字符串
# node
# lsp
# php
# 遍历
# dom
# symfony
# undefined
# pdo
相关栏目:
<?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; ?>
】
相关推荐
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Win10如何更改开机密码_Windows10登录
- Linux如何使用Curl发送请求_Linux下A
- Win11怎么设置任务栏图标大小_Windows1
- Mac版Final Cut Pro入门_Mac视频
- Windows如何拦截腾讯视频广告_Windows
- Laravel 查询 JSON 列:高效筛选包含数
- Win11如何更改任务栏颜色 Win11自定义任务
- 如何在JavaScript中动态拼接PHP的bas
- php订单日志怎么按金额排序_php按订单金额排序
- Win10如何优化内存使用_Win10内存优化技巧
- 如何使用 Python 合并文件夹内多个 Exce
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- Win11笔记本怎么看电池健康度_Win11电池报
- Win11怎么设置多显示器任务栏 Win11扩展任
- Go语言中CookieJar的持久化机制解析:内存
- Python与MongoDB NoSQL开发实战_
- PythonDocker高级项目部署教程_多容器管
- Windows10无法识别USB设备描述符请求失败
- Python网络日志追踪_请求定位解析【教程】
- Windows蓝屏错误0x00000018怎么处理
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- c++怎么用jemalloc c++替换默认内存分
- windows如何备份注册表_windows导出和
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Linux如何安装Golang环境_Linux下G
- Windows10电脑怎么设置电源按钮_Win10
- php本地部署支持nodejs吗_php与node
- 如何优化Golang内存分配与GC调度_Golan
- Windows音频驱动无声音原因解析_声卡驱动错误
- php订单日志怎么在swoole写_php协程sw
- Windows10无法连接到Internet_Wi
- 如何使用Golang指针与接口结合_实现方法调用和
- Win11无法拖拽文件到任务栏怎么办_Win11开
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- Python对象比较排序规则_集合使用说明【指导】
- Win10文件历史记录怎么用 Win10开启自动备
- PHP的Workerman对架构扩展有啥帮助_应用
- PHP cURL GET请求:正确设置认证与自定义
- 如何在 Go 中创建包含 map 的 slice(
- LINUX如何开放防火墙端口_Linux fire
- Go 中 defer 在 goroutine 内部
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- 如何在Golang中实现邮件发送功能_Golang
- c++ std::future和std::prom
- Win11怎么关闭资讯和兴趣_Windows11任
- c++中如何计算坐标系中两点间距离_c++勾股定理
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- Windows10如何查看保存的WiFi密码_Wi


QQ客服