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 相关文章推荐
javascript针对DOM的应用实例(一)
Apr 15 Javascript
解析Jquery的LigerUI如何实现文件上传
Jul 09 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
js控制文本框只输入数字和小数点的方法
Mar 10 Javascript
JavaScript程序中实现继承特性的方式总结
Jun 24 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
Vue.js render方法使用详解
Apr 05 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
vue项目国际化vue-i18n的安装使用教程
Mar 14 Javascript
详解vue修改elementUI的分页组件视图没更新问题
Nov 13 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 31 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
自动跳转中英文页面
2006/10/09 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
vue小白入门教程
2018/04/02 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
微信小程序自定义导航栏
2018/12/31 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
Python的多态性实例分析
2015/07/07 Python
探究python中open函数的使用
2016/03/01 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
使用python生成目录树
2018/03/29 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
详解Python yaml模块
2020/09/23 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
受欢迎的大学生自我评价
2013/12/05 职场文书
联谊会主持词
2014/03/26 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS