解决跨浏览器读取XML文件的方法


读取xml文件兼容IE,以及chrom等浏览器的方法:

//检测系统支持的XMLDom方式 function E_getControlPrefix() { var prefixes = ["MSXML2", "Microsoft", "@Microsoft", "MSXML", "MSXML3"]; var o, o2; for (var i = 0; i < prefixes.length; i++) { try { // try to create the objects o = new ActiveXObject(prefixes[i] + ".XmlHttp"); o2 = new ActiveXObject(prefixes[i] + ".XmlDom"); return E_getControlPrefix.prefix = prefixes[i]; } catch (ex) { }; } } //创建xmldom对象 function loadXmlFile(xmlFile) { var xmlDom = null; try{ if (window.ActiveXObject) { //支持IE浏览器,可跨域 xmlDom = new ActiveXObject(E_getControlPrefix() + ".XMLDOM"); //xmlDom.loadXML(xmlFile);//如果用的是XML字符串 xmlDom.async = false; xmlDom.loadXML(xmlFile); //如果用的是xml文件。 return xmlDom; } else if (document.implementation && document.implementation.createDocument) { //支持火狐浏览器,可跨域 xmlDom = document.implementation.createDocument("", "", null); //xmlDom.async = false; xmlDom.load(xmlFile); return xmlDom; } } catch (ex) { } try{ //xmlhttp方式,支持火狐、chrome、oprea等浏览器,但不可跨域 var xmlhttp = new window.XMLHttpRequest(); xmlhttp.open("GET", xmlFile, false); xmlhttp.send(null); if (xmlhttp.status == 200) { xmlDom = xmlhttp.responseXML; } else { //传入的是XML字符串而非XML地址时非IE浏览器处理 var parseXml = new DOMParser(); var xmlDom = parseXml.parseFromString(xmlFile, "text/xml"); } } catch (ex) { //传入的是XML字符串而非XML地址时非IE浏览器处理 var parseXml = new DOMParser(); var xmlDom = parseXml.parseFromString(xmlFile, "text/xml"); } return xmlDom; }


OK 我们现在终于可以在chrome中加载XMLDOM文档了。不过别高兴的太早,问题还在后面呢。。。
我们在chrome中遍历一个XMLDOM文档,会出现如下问题。。。
1.text属性取不到值。。。被坑死了
2.childNode数量比IE下多。。。。彻底服了
3.无法使用selectNode和selectSingleNode方法
下面我们来一个一个的解决他们
1.text属性取不到值

function GetXmlText(node) { if (node.text != undefined) return node.text; else return node.textContent; }

//也可以使用prototype封装到node的对象上。。这里就不做多的阐述了。。

2.childNode数量比IE下多
一个不同的root节点下IE下只有2个节点,Chrome下缺有5个。。。
处理办法 通过判断不同浏览器或者节点数量来修改自己的逻辑代码(具体的节点位置请根据实际情况自己判断)

3.无法使用selectNode和selectSingleNode方法

function selectSingleNode(node, xpath) { if (!window.ActiveXObject) { var x = selectNodes(node, xpath) if (!x || x.length < 1) return null; return x[0]; } else { return node.selectSingleNode(xpath); } } function selectNodes(node, xpath) { if (!window.ActiveXObject) { var xpe = new XPathEvaluator(); var nsResolver = xpe.createNSResolver(node.ownerDocument == null ? node.documentElement : node.ownerDocument.documentElement); var result = xpe.evaluate(xpath, node, nsResolver, 0, null); var found = []; var res; while (res = result.iterateNext()) found.push(res); return found; } else { return node.selectNodes(xpath); } }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值