如何用JavaScript遍历XML节点树
发布时间 - 2026-01-03 00:00:00 点击率:次JavaScript遍历XML节点树需先用DOMParser(或IE的ActiveXObject)解析字符串为DOM文档,再按nodeType区分元素、属性、文本节点递归访问,注意过滤空白文本并兼顾浏览器兼容性。
JavaScript遍历XML节点树,核心是把XML字符串解析成DOM文档对象,再用标准DOM方法逐层访问节点。关键在于正确解析、区分节点类型、处理文本内容,并注意浏览器兼容性(尤其是旧版IE)。
解析XML字符串为DOM文档
现代浏览器支持 DOMParser,是最通用的方式:
const xmlStr = ``; const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlStr, "text/xml"); // 检查是否解析失败(如语法错误) if (xmlDoc.querySelector("parsererror")) { console.error("XML解析失败"); } Harry Potter J.K. Rowling
递归遍历所有节点(含元素、属性、文本)
XML节点类型多样(元素、属性、文本、注释等),需用 nodeType 判断,避免误读空白文本节点:
-
1 元素节点(
nodeType === 1):可获取标签名、属性、子节点 -
2 属性节点(
nodeType === 2):在元素的attributes集合中,不自动出现在childNodes -
3 文本节点(
nodeType === 3):注意过滤掉纯空白(如换行缩进)
示例递归函数:
function traverse(node, depth = 0) {
const indent = " ".repeat(depth);
switch(node.nodeType) {
case 1: // 元素节点
console.log(`${indent}<${node.nodeName}>`);
// 遍历属性
for (let attr of node.attributes || []) {
console.log(`${indent} @${attr.name}="${attr.value}"`);
}
// 遍历子节点
for (let child of node.childNodes) {
traverse(child, depth + 1);
}
break;
case 3: // 文本节点,只打印非空白内容
const text = node.nodeValue.trim();
if (text) {
console.log(`${indent}#text: "${text}"`);
}
break;
}
}
traverse(xmlDoc.documentElement); // 从根元素开始
按需遍历:常用快捷方式
实际开发中很少全量递归,更多是定位目标节点:
-
获取所有同名元素:
xmlDoc.getElementsByTagName("title") -
查找带特定属性的元素:
xmlDoc.querySelectorAll('book[category="fiction"]') -
获取某个元素的文本内容:
element.textContent(推荐)或element.firstChild.nodeValue -
读取属性值:
element.getAttribute("lang")或element.getAttributeNode("lang").value
兼容IE8–9的备用方案(已过时但偶有需要)
老版IE不支持 DOMParser,需用 ActiveXObject:
function parseXMLForIE(xmlStr) {
if (window.ActiveXObject) {
const doc = new ActiveXObject("Microsoft.XMLDOM");
doc.async = false;
doc.loadXML(xmlStr);
return doc;
}
// 其他浏览器走 DOMParser
}
不复杂但容易忽略细节。重点是先确保解析成功,
再按节点类型安全访问,避免直接调用 nodeValue 在非文本节点上。
# javascript
# java
# node
# go
# 浏览器
# switch
# win
# microsoft
# 递归函数
# xml解析
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
EditPlus中的正则表达式 实战(4)
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
php 三元运算符实例详细介绍
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel集合Collection怎么用_Laravel集合常用函数详解
Laravel storage目录权限问题_Laravel文件写入权限设置
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Thinkphp 中 distinct 的用法解析
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel观察者模式如何使用_Laravel Model Observer配置
JavaScript如何实现路由_前端路由原理是什么
进行网站优化必须要坚持的四大原则
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
JavaScript模板引擎Template.js使用详解
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
奇安信“盘古石”团队突破 iOS 26.1 提权
如何在阿里云香港服务器快速搭建网站?
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
,南京靠谱的征婚网站?
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何快速搭建高效WAP手机网站?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
详解CentOS6.5 安装 MySQL5.1.71的方法
网站建设整体流程解析,建站其实很容易!
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何获取免费开源的自助建站系统源码?
如何为不同团队 ID 动态生成多个独立按钮
大连网站制作公司哪家好一点,大连买房网站哪个好?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
实例解析angularjs的filter过滤器
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何用狗爹虚拟主机快速搭建网站?

