问题描述:因为在一个应用中需要解析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 补遗)
阅读(2345) | 评论(0) | 转发(0) |