js操作XML文件的實(shí)現(xiàn)方法兼容IE與FireFox
最近項(xiàng)目中用到了xml,需求是用戶安裝產(chǎn)品時(shí)先把一系列的數(shù)據(jù)保存到xml文件中,當(dāng)執(zhí)行到最后一步時(shí)才寫入數(shù)據(jù)庫(kù),這樣最大限度的減少了數(shù)據(jù)庫(kù)的訪問(wèn),于是不得不糾結(jié)在各瀏覽器的兼容性的問(wèn)題(悲哀啊....)
進(jìn)入正文 下面是一個(gè)xml文件 (createInstal.xml)
<?xml version="1.0" encoding="utf-8"?> <info> <Item> <id descrption="級(jí)別" name="1" f_chines="編號(hào)" t_chines="編號(hào)" english="id" value="1">編號(hào)</id> <levelname descrption="級(jí)別" name="" f_chines="級(jí)別名稱" t_chines="級(jí)別名稱" english="Level-Name" value="級(jí)別一">級(jí)別名稱</levelname> <decrption descrption="級(jí)別" name="" f_chines="級(jí)別描述" t_chines="級(jí)別描述" english="Level-Description" value="級(jí)別描述一">描述</decrption> <Tchines descrption="級(jí)別" name="" f_chines="繁體中文" t_chines="繁體中文" english="T-Chinese" value="級(jí)別一">繁體中文</Tchines> <english descrption="級(jí)別" name="" f_chines="英文名稱" t_chines="英文名稱" english="English" value="LevelOne">英文名稱</english> <獎(jiǎng)項(xiàng)六 descrption="獎(jiǎng)項(xiàng)" name="106" f_chines="獎(jiǎng)項(xiàng)六" t_chines="獎(jiǎng)項(xiàng)六" english="Worda-of-t" value="a"/> <獎(jiǎng)項(xiàng)十一 descrption="獎(jiǎng)項(xiàng)" name="111" f_chines="獎(jiǎng)項(xiàng)十一" t_chines="獎(jiǎng)項(xiàng)十一" english="11" value="0.05"/> <獎(jiǎng)項(xiàng)十二 descrption="獎(jiǎng)項(xiàng)" name="112" f_chines="獎(jiǎng)項(xiàng)十二" t_chines="獎(jiǎng)項(xiàng)十二" english="2222" value="0.04"/> <獎(jiǎng)項(xiàng)十三 descrption="獎(jiǎng)項(xiàng)" name="113" f_chines="獎(jiǎng)項(xiàng)十三" t_chines="獎(jiǎng)項(xiàng)十三" english="3333" value="0.85"/> <獎(jiǎng)項(xiàng)一 descrption="獎(jiǎng)項(xiàng)" name="101" f_chines="獎(jiǎng)項(xiàng)一" t_chines="獎(jiǎng)項(xiàng)一" english="Aword-of-a" value="0.90"/> </Item> </info>
為了能兼容IE與FF,寫如下幾個(gè)函數(shù)(loadxml.js):
var is_Ie =false; //是否為IE瀏覽器 if (window.ActiveXObject) { is_Ie =true; } //加載多瀏覽器兼容的xml文檔 function loadXml(xmlUrl) { var xmldoc =null; try { xmldoc =new ActiveXObject("Microsoft.XMLDOM"); } catch (e) { try { xmldoc = document.implementation.createDocument("", "", null); } catch (e) { alert(e.message); } } try { //關(guān)閉異步加載 xmldoc.async =false; xmldoc.load(xmlUrl); return xmldoc; } catch (e) { alert(e.message); } returnnull; } //將一個(gè)xml文檔格式的字符串換成xml文檔 function createXml(xmlText) { if (!xmlText) { returnnull; try { var xmldocm =new ActiveXObject("Microsoft.XMLDOM"); xmldocm.loadXML(xmlText); return xmldocm; } catch (e) { try { returnnew DOMParse().parseFromString(xmlText, "text/xml"); } catch (e) { returnnull; } } } } //獲取節(jié)點(diǎn)及其子節(jié)點(diǎn)的文本 function getXmlText(oNode) { if (oNode.text) {//IE return oNode.tex; } var sText =""; for (var i =0; i < oNode.childNodes.length; i++) { //遍歷子節(jié)點(diǎn) if (oNode.childNodes[i].hasChildNodes()) { //是否有子節(jié)點(diǎn) sText += getXmlText(oNode.childNodes[i]); } else { sText += oNode[i].childNodes.nodeValue; } } return sText; } //獲取節(jié)點(diǎn)及其子節(jié)點(diǎn)的字符串標(biāo)識(shí) function getXml(oNode) { if (oNode.xml) {//IE return oNode.xml; } var serializer =new XMLSerializer(); return serializer.serializeToString(oNode); } //獲取指定節(jié)點(diǎn)的文本(注意:也可以用oNode.childNodes[0].nodeValue來(lái)獲取節(jié)點(diǎn)的文本信息,這樣就不用考慮瀏覽器的問(wèn)題了oNodeoNode) function getxmlnodeText(oNode) { if (is_Ie) { return oNode.text; } else { if (oNode.nodeType ==1) return oNode.textContent; } } //獲取指定節(jié)點(diǎn)的屬性值 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 不再是問(wèn)題,具體的操作方法如下:
var docum = loadxml("createInstal.xml");//加載一個(gè)xml文件 var root = docum.documentElement;//根節(jié)點(diǎn) var nodelist = root.getElementsByTagName("Items"); for(var i=0;i<nodelist[0].childNodes.length;i++) { var attr = getxmlnodeattribute(nodeList[0].childNodes[i], "descrption");//獲取這個(gè)節(jié)點(diǎn)的descrption屬性 if(attr != "undefined")//目的是兼容FF瀏覽器 { alert(attr); } }
這樣就能保證IE與FF的兼容,(目前谷歌瀏覽器沒(méi)有辦法用這種方法兼容,還待修改)
另外說(shuō)下FireFox獲取xml的兩種方法:
firefox中JS讀取XML文件
在網(wǎng)上搜“firefox中JS讀取XML文件”的方法,找了半天,好 多都是問(wèn)了沒(méi)人答的??吹揭欢殉绦騿T在抱怨firefox:“除了累死程序員沒(méi)什么好處?!?,言歸正傳。firefox不支持ie中的 ActiveXObject對(duì)象,要得到一個(gè)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對(duì)象了。
2、var oXmlHttp = new XMLHttpRequest() ;
oXmlHttp.open( "GET", "test.xml", false ) ;
oXmlHttp.send(null) ;
//oXmlHttp.responseXML就是xml對(duì)象了。
注意:
1、火狐解析xml文檔
2、火狐瀏覽器和ie解析xml不一樣節(jié)點(diǎn)的值用textContent。
3、并且他會(huì)在有的層次child節(jié)點(diǎn)(即使用childNodes時(shí))前后都加上"\n"換行符。(這個(gè)搞不清楚為什么,用firebug調(diào)試的時(shí)候就是這個(gè)樣子,所以寫過(guò)的代碼最好測(cè)試一下,換個(gè)環(huán)境就不對(duì)了) ,也就是說(shuō)第1個(gè)節(jié)點(diǎn)是"\n",第2個(gè)節(jié)點(diǎn)才是真正的
第一個(gè)節(jié)點(diǎn)。 第3個(gè)節(jié)點(diǎn)是"\n",第4個(gè)節(jié)點(diǎn)才是真正的第二個(gè)節(jié)點(diǎn)。
根據(jù)上述的火狐的情況,我這里有個(gè)例子避免了使用childNodes,而達(dá)到兼容性:點(diǎn)擊進(jìn)入
以上就是小編為大家?guī)?lái)的js操作XML文件的實(shí)現(xiàn)方法兼容IE與FireFox全部?jī)?nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
javascript 保存文件到本地實(shí)現(xiàn)方法
本文將提供兩種方式保存圖片,大家可以根據(jù)喜歡自由選擇2012-11-11JS將滑動(dòng)門改為選項(xiàng)卡(需鼠標(biāo)點(diǎn)擊)的實(shí)現(xiàn)方法
這篇文章主要介紹了JS將滑動(dòng)門改為選項(xiàng)卡(需鼠標(biāo)點(diǎn)擊)的實(shí)現(xiàn)方法,涉及JavaScript頁(yè)面元素遍歷及樣式替換的相關(guān)技巧,再通過(guò)onmouseover與onclick即可分別實(shí)現(xiàn)滑動(dòng)門與選項(xiàng)卡兩種效果,需要的朋友可以參考下2015-09-09微信小程序開(kāi)發(fā)之實(shí)現(xiàn)別踩白塊游戲
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)微信小程序開(kāi)發(fā)一個(gè)簡(jiǎn)單的別踩白塊游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以和小編一起學(xué)習(xí)一下2023-02-02新年快樂(lè)! javascript實(shí)現(xiàn)超級(jí)炫酷的3D煙花特效
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)超級(jí)炫酷的3D煙花特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01將HTML格式的String轉(zhuǎn)化為HTMLElement的實(shí)現(xiàn)方法
本節(jié)主要介紹了將HTML格式的String轉(zhuǎn)化為HTMLElement的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-08-08javascript表格控件:Chgrid,簡(jiǎn)化型
javascript表格控件:Chgrid,簡(jiǎn)化型...2007-04-04layer彈出的iframe層在執(zhí)行完畢后關(guān)閉當(dāng)前彈出層的方法
今天小編就為大家分享一篇layer彈出的iframe層在執(zhí)行完畢后關(guān)閉當(dāng)前彈出層的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08用js寫的一個(gè)路由(簡(jiǎn)單實(shí)例)
下面小編就為大家?guī)?lái)一篇用js寫的一個(gè)路由(簡(jiǎn)單實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09基于JavaScript實(shí)現(xiàn)線性漸變的高斯模糊效果
這篇文章主要為大家詳細(xì)介紹了高斯模糊算法以及線性漸變的高斯模糊算法的原理,并通過(guò)一個(gè)小demo展示了如何實(shí)現(xiàn)y方向上線性漸變的高斯模糊效果,需要的可以了解下2024-01-01