如何用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 = `
  
    Harry Potter
    J.K. Rowling
  
`;

const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlStr, "text/xml");

// 检查是否解析失败(如语法错误)
if (xmlDoc.querySelector("parsererror")) {
  console.error("XML解析失败");
}

递归遍历所有节点(含元素、属性、文本)

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如何操作浏览器历史记录_怎样实现无刷新导航  如何用狗爹虚拟主机快速搭建网站?