最近项目中用到了xml,需求是用户安装产品时先把一系列的数据保存到xml文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊....)
进入正文 下面是一个xml文件 (createInstal.xml)
为了能兼容IE与FF,写如下几个函数(loadxml.js):
//获取节点及其子节点的字符串标识
function getXml(oNode) {
if (oNode.xml) {//IE
return oNode.xml;
}
var serializer =new XMLSerializer();
return serializer.serializeToString(oNode);
}
//获取指定节点的文本(注意:也可以用oNode.childNodes[0].nodeValue来获取节点的文本信息,这样就不用考虑浏览器的问题了oNodeoNode)
function getxmlnodeText(oNode) {
if (is_Ie) {
return oNode.text;
} else {
if (oNode.nodeType ==1)
return oNode.textContent;
}
}
//获取指定节点的属性值
function getxmlnodeattribute(oNode,attrName) {
if (is_Ie) {
return oNode.getAttribute(attrName);
} else {
if (oNode.nodeType ==1|| oNode.nodeType =="1")return oNode.attributes[attrName].value;return"undefined";}}
ok IE与FF 不再是问题,具体的操作方法如下:
var root = docum.documentElement;//根节点
var nodelist = root.getElementsByTagName("Items");
for(var i=0;i<nodelist[0].childNodes.length;i++)
{
var attr = getxmlnodeattribute(nodeList[0].childNodes[i],"descrption");//获取这个节点的descrption属性
if(attr != "undefined")//目的是兼容FF浏览器
{
alert(attr);
}
}
这样就能保证IE与FF的兼容,(目前谷歌浏览器没有办法用这种方法兼容,还待修改)
文件
在网上搜“firefox中JS读取XML文件”的方法,找了半天,好 多都是问了没人答的。看到一堆程序员在抱怨firefox:“除了累死程序员没什么好处。”,言归正传。firefox不支持ie中的 ActiveXObject对象,要得到一个XML DOM有以下2种方法:
1、document.implementation.createDocument("",null); 2、window.XMLHttpRequest
示例:1、var dom=document.implementation.createDocument("",null);
dom.async=false; dom.load("test.xml");//dom就是xml对象了。
2、var oXmlHttp = new XMLHttpRequest() ; oXmlHttp.open( "GET","test.xml",false ) ; oXmlHttp.send(null) ; //oXmlHttp.responseXML就是xml对象了。
注意:
1、火狐解析xml文档
2、火狐浏览器和ie解析xml不一样节点的值用textContent。
3、并且他会在有的层次child节点(即使用childNodes时)前后都加上"\n"换行符。(这个搞不清楚为什么,用firebug调试的时候就是这个样子,所以写过的代码最好测试一下,换个环境就不对了),也就是说第1个节点是"\n",第2个节点才是真正的
第一个节点。 第3个节点是"\n",第4个节点才是真正的第二个节点。
根据上述的火狐的情况,我这里有个例子避免了使用childNodes,而达到兼容性: