JS跨浏览器解析XML应用过程详解


Posted in Javascript onOctober 16, 2020

首先介绍简单的理论:

对于XML,我们可以理解它是一种树结构,它包含根,元素,属性,文本等内容。不同浏览器都有自己的解析器,把XML读入内存,并把它转换为可被 JavaScript 访问的 XML DOM 对象。

微软的 XML 解析器与其他浏览器中的解析器是有差异的。微软的解析器支持对 XML 文件和 XML 字符串(文本)的加载,而其他浏览器使用单独的解析器。不过,所有的解析器都含有遍历 XML 树、访问、插入及删除节点的函数。

如果你使用的是一个本地文件或者网络文件且该文件在是在本服务器,那么对于IE和其他浏览器来说都可以通过load(uRl),loadXML(strXML)来创建Xdom对象。但是对于文本,除IE外需要一个单独的解析器来处理。

以下函数用于根据不同的浏览器来创建Xdom对象:

function loadXMLDoc() { 
  var xmlDoc; 
  // code for IE 
  if (window.ActiveXObject){ 
   xmlDoc=new ActiveXObject("Microsoft.XMLDOM");//创建空的微软 XML 文档对象 
   //xmlDoc.load(uRl); 
   //loadXML() 方法用于加载字符串(文本),而 load() 用于加载文件 
   xmlDoc.loadXML(xmlstr); 
  } 
  // code for Mozilla, Firefox, Opera, etc. 
  else if(document.implementation&&document.implementation.createDocument){  
   xmlDoc=document.implementation.createDocument("","",null); 
   //xmlDoc.load(uRl); 
   //Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象 
   parser=new DOMParser(); 
   xmlDoc=parser.parseFromString(txt,"text/xml"); 
  }else{ 
   alert('Your browser cannot handle this script'); 
  } 
  //关闭异步加载,这样可确保在文档完整加载之前,解析器不会继续执行脚本 
  xmlDoc.async=false;  
  createTable(xmlDoc); 
}

方法内有具体的解析,我不再??拢?杂诮馕龅哪谌荩?治?址??臀谋玖街帧?/p>

首先定义一个字符串:

var xmlstr="<?xml version=\"1.0\" encoding=\"UTF-8\"?><goodss><goods id=\"1\"><name>数码相机</name><price>3206(元)</price></goods><goods id=\"2\"><name>联想笔记本电脑</name><price>3206(元)</price></goods></goodss>";

然后定义一个goods.xml文件:

文件内容为:

<?xml version="1.0" encoding="UTF-8"?> 
<goodss> 
  <goods id="1"> 
    <name>数码相机</name> 
    <price>3206(元)</price> 
  </goods> 
  <goods id="2"> 
    <name>联想笔记本电脑</name> 
    <price>3206(元)</price> 
  </goods> 
</goodss>

通过取消和注释方式来选择是文本还是字符串。

这个方法可以是通用的,下面再来解析这个Xdom对象:

function createTable(xmldoc){ 
  var goodss=xmldoc.getElementsByTagName("goods"); 
  for(var i=0;i<goodss.length;i++){ 
    var g=goodss[i]; 
    if (g.nodeType==1){ 
      var name=g.getElementsByTagName("name")[0].childNodes[0].nodeValue; 
      var price=g.getElementsByTagName("price")[0].childNodes[0].nodeValue; 
      var id=g.getAttribute("id"); 
      document.write(id + "-->" + name + "-->" + price); 
      document.write("<br />"); 
    } 
  }   
}

对于使用到的函数和属性我们来解析一下:

/* 
一些典型的 DOM 属性 
x.nodeName - x 的名称 
x.nodeValue - x 的值 
x.parentNode - x 的父节点 
x.childNodes - x 的子节点 
x.attributes - x 的属性节点 
x.firstChild - x 的第一个子节点,等同于childNodes[0] 
x.lastChild - x 的最后一个子节点 
x.data - x 的内容,等同nodeValue 
x.length - x 的长度 
x.nodeType - x 的类型:1,元素,2,属性,3,文本,4,注释,5,文档 
在上面的列表中,x 是一个节点对象 
XML DOM 方法 
x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素,返回的是数组 
x.getAttribute(name) - 返回属性的值 
*/ 
/*出于安全方面的原因,现代的浏览器不允许跨域的访问。 
这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上。 
否则,xmlDoc.load() 将产生错误 "Access is denied"。 
*/

早页面增加一个按钮来调用函数:

<input type="button" name="bxml" value="Read" onclick="loadXMLDoc()" />

页面将会输出XMl内节点的属性和子节点的内容。对于一般应用来说,我觉得上面内容已经足够了。我会在之后补充一些其他操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让getElementsByName适应IE和firefox的方法
Sep 24 Javascript
基于jquery ajax 用户无刷新登录方法详解
Apr 28 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
基于JS实现的笛卡尔乘积之商品发布
May 13 Javascript
JS图片等比例缩放方法完整示例
Aug 03 Javascript
JS匿名函数实例分析
Nov 26 Javascript
JS查找字符串中出现最多的字符及个数统计
Feb 04 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
May 18 Javascript
使用SVG基本操作API的实例讲解
Sep 14 Javascript
简化版的vue-router实现思路详解
Oct 19 Javascript
Vue 实现一个命令式弹窗组件功能
Sep 25 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 Javascript
JS实现简易图片自动轮播
Oct 16 #Javascript
JS绘图Flot如何实现动态可刷新曲线图
Oct 16 #Javascript
基于JQuery和DWR实现异步数据传递
Oct 16 #jQuery
JS绘图Flot应用图形绘制异常解决方案
Oct 16 #Javascript
swiper4实现移动端导航栏tab滑动切换
Oct 16 #Javascript
JS highcharts动态柱状图原理及实现
Oct 16 #Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 #Javascript
You might like
第八节 访问方式 [8]
2006/10/09 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python 提取文件的小程序
2009/07/29 Python
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
python3爬取各类天气信息
2018/02/24 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
方正Java笔试题
2014/07/03 面试题
《金钱的魔力》教学反思
2014/02/24 职场文书
啤酒节策划方案
2014/05/28 职场文书
语文课外活动总结
2014/08/27 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
卖车协议书范例
2014/09/16 职场文书
比赛主持人开场白
2015/05/29 职场文书
600字作文之感受大自然
2019/11/27 职场文书
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏