Chinaunix首页 | 论坛 | 博客
  • 博客访问: 683090
  • 博文数量: 95
  • 博客积分: 1773
  • 博客等级: 上尉
  • 技术积分: 1653
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-17 23:28
文章分类
文章存档

2018年(2)

2017年(10)

2016年(7)

2015年(48)

2014年(2)

2013年(2)

2012年(2)

2011年(7)

2010年(7)

2009年(3)

2008年(1)

2007年(4)

分类: 系统运维

2010-12-13 17:49:08

    问题描述:因为在一个应用中需要解析XML文件,而这个应用会本地或者网络化使用,应用需要尽可能的兼容常见网络浏览器。
    研究方法:搜索各相关文档,测试。
    结果:获得如下代码(兼容IE/FireFox/Opera/Safari,部分兼容chrome——网络环境)
    其实各个浏览器解析XML兼容性的关键是构造合适的用于解析XML的对象,在IE中是利用 ActiveXObject("Microsoft.XMLDOM")创建,在FireFox和Opera中是利用 document.implementation.createDocument("","",null)来创建,Safari和 chrome利用下面这段代码
 
 xmlhttp = new window.XMLHttpRequest();
 xmlhttp.open("GET", xmlFile, xmlAsyncFlag);
 xmlhttp.send(null);
 xmlDoc = xmlhttp.respon***ML.documentElement;

所以最终的代码就成了:

function initXmlDoc(xmlFile){ //初始化xmlDoc对象,xmlFile是xml文件路径

  var xmlDoc=null;

  var xmlAsyncFlag = false;

  try{
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = xmlAsyncFlag;
        xmlDoc.load(xmlFile);
    }catch(e){
        try{
            xmlDoc = document.implementation.createDocument("","",null);
            xmlDoc.async = xmlAsyncFlag;
            xmlDoc.load(xmlFile);
        }catch(e){
            try{
                var xmlhttp = new window.XMLHttpRequest();
                xmlhttp.open("GET", xmlFile, xmlAsyncFlag);
                xmlhttp.send(null);
                xmlDoc = xmlhttp.respon***ML.documentElement;
            }catch(e){
              alert(e.message);
            }
        }
    }

return xmlDoc;
}

XML的具体解析所有浏览器是相同的,比如 xmlDoc.getElementsByTagName(itemName)就可以获得itemName标签定义的数组,再利用 childNodes[0].nodeValue,如
xmlDoc.getElementsByTagName(itemName) [0].childNodes[0].nodeValue就可以获得第一个节点的值,要获取节点属性需要用到 attributes.getNamedItem(attrName).nodeValue 这样的语法,比如
xmlDoc.getElementsByTagName(itemName) [0].attributes.getNamedItem(attrName).nodeValue 将获取第一个itemName节点attrName属性值。

    总的来说,影响各浏览器解析XML的关键还是XML文件的获取和解析对象创建方式上,上面的代码在网络环境下(http下)所有浏览器都可以用,而本地使 用时可能chrome安全设置比较高,不能读取到XML,所以就造成不能创建xmlDoc解析对象。这些不同的根本来源是各个浏览器采用的 Javascript引擎不同,此外引擎安全设置不同。


(测试环境:Windows7 64bit,IE 8.0.7600.16385,Firefox 3.6.12,Flock 2.6.1,Opera 10.61,Safari 5.0.3,Chrome 8.0.552.215)
---------------
替换方案:因为xml数据理论上都可以转换成json类数据,而json类数据在各个浏览器中使用兼容性更好,而且网络环境和本地环境都一致,所以一个可选的方案就是进行数据格式转换。(2011.10.26 补遗)
阅读(2276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~