js操作XML文件的实现方法兼容IE与FireFox
最近项目中用到了xml,需求是用户安装产品时先把一系列的数据保存到xml文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊....)
进入正文下面是一个xml文件(createInstal.xml)
<?xmlversion="1.0"encoding="utf-8"?> <info> <Item> <iddescrption="级别"name="1"f_chines="编号"t_chines="編號"english="id"value="1">编号</id> <levelnamedescrption="级别"name=""f_chines="级别名称"t_chines="級別名稱"english="Level-Name"value="级别一">级别名称</levelname> <decrptiondescrption="级别"name=""f_chines="级别描述"t_chines="級別描述"english="Level-Description"value="级别描述一">描述</decrption> <Tchinesdescrption="级别"name=""f_chines="繁体中文"t_chines="繁體中文"english="T-Chinese"value="級別一">繁体中文</Tchines> <englishdescrption="级别"name=""f_chines="英文名称"t_chines="英文名稱"english="English"value="LevelOne">英文名称</english> <奖项六descrption="奖项"name="106"f_chines="奖项六"t_chines="獎項六"english="Worda-of-t"value="a"/> <奖项十一descrption="奖项"name="111"f_chines="奖项十一"t_chines="獎項十一"english="11"value="0.05"/> <奖项十二descrption="奖项"name="112"f_chines="奖项十二"t_chines="獎項十二"english="2222"value="0.04"/> <奖项十三descrption="奖项"name="113"f_chines="奖项十三"t_chines="獎項十三"english="3333"value="0.85"/> <奖项一descrption="奖项"name="101"f_chines="奖项一"t_chines="獎項一"english="Aword-of-a"value="0.90"/> </Item> </info>
为了能兼容IE与FF,写如下几个函数(loadxml.js):
varis_Ie=false;//是否为IE浏览器
if(window.ActiveXObject){
is_Ie=true;
}
//加载多浏览器兼容的xml文档
functionloadXml(xmlUrl){
varxmldoc=null;
try{
xmldoc=newActiveXObject("Microsoft.XMLDOM");
}
catch(e){
try{
xmldoc=document.implementation.createDocument("","",null);
}catch(e){
alert(e.message);
}
}
try{
//关闭异步加载
xmldoc.async=false;
xmldoc.load(xmlUrl);
returnxmldoc;
}
catch(e){
alert(e.message);
}
returnnull;
}
//将一个xml文档格式的字符串换成xml文档
functioncreateXml(xmlText){
if(!xmlText){
returnnull;
try{
varxmldocm=newActiveXObject("Microsoft.XMLDOM");
xmldocm.loadXML(xmlText);
returnxmldocm;
}
catch(e){
try{
returnnewDOMParse().parseFromString(xmlText,"text/xml");
}
catch(e){
returnnull;
}
}
}
}
//获取节点及其子节点的文本
functiongetXmlText(oNode){
if(oNode.text){//IE
returnoNode.tex;
}
varsText="";
for(vari=0;i<oNode.childNodes.length;i++){//遍历子节点
if(oNode.childNodes[i].hasChildNodes()){//是否有子节点
sText+=getXmlText(oNode.childNodes[i]);
}else{
sText+=oNode[i].childNodes.nodeValue;
}
}
returnsText;
}
//获取节点及其子节点的字符串标识
functiongetXml(oNode){
if(oNode.xml){//IE
returnoNode.xml;
}
varserializer=newXMLSerializer();
returnserializer.serializeToString(oNode);
}
//获取指定节点的文本(注意:也可以用oNode.childNodes[0].nodeValue来获取节点的文本信息,这样就不用考虑浏览器的问题了oNodeoNode)
functiongetxmlnodeText(oNode){
if(is_Ie){
returnoNode.text;
}else{
if(oNode.nodeType==1)
returnoNode.textContent;
}
}
//获取指定节点的属性值
functiongetxmlnodeattribute(oNode,attrName){
if(is_Ie){
returnoNode.getAttribute(attrName);
}else{
if(oNode.nodeType==1||oNode.nodeType=="1")returnoNode.attributes[attrName].value;return"undefined";}}
ok IE与FF不再是问题,具体的操作方法如下:
vardocum=loadxml("createInstal.xml");//加载一个xml文件
varroot=docum.documentElement;//根节点
varnodelist=root.getElementsByTagName("Items");
for(vari=0;i<nodelist[0].childNodes.length;i++)
{
varattr=getxmlnodeattribute(nodeList[0].childNodes[i],"descrption");//获取这个节点的descrption属性
if(attr!="undefined")//目的是兼容FF浏览器
{
alert(attr);
}
}
这样就能保证IE与FF的兼容,(目前谷歌浏览器没有办法用这种方法兼容,还待修改)
另外说下FireFox获取xml的两种方法:
firefox中JS读取XML文件
在网上搜“firefox中JS读取XML文件”的方法,找了半天,好多都是问了没人答的。看到一堆程序员在抱怨firefox:“除了累死程序员没什么好处。”,言归正传。firefox不支持ie中的ActiveXObject对象,要得到一个XMLDOM有以下2种方法:
1、document.implementation.createDocument("","",null);
2、window.XMLHttpRequest
示例:1、vardom=document.implementation.createDocument("","",null);
dom.async=false;
dom.load("test.xml");//dom就是xml对象了。
2、varoXmlHttp=newXMLHttpRequest();
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,而达到兼容性:点击进入
以上就是小编为大家带来的js操作XML文件的实现方法兼容IE与FireFox全部内容了,希望大家多多支持毛票票~