js操作XML檔案的實現方法相容IE與FireFox,xmlfirefox
最近項目中用到了xml,需求是使用者安裝產品時先把一系列的資料儲存到xml檔案中,當執行到最後一步時才寫入資料庫,這樣最大限度的減少了資料庫的訪問,於是不得不糾結在各瀏覽器的相容性的問題(悲哀啊....)
進入本文 下面是一個xml檔案 (createInstal.xml)
<?xml version="1.0" encoding="utf-8"?><info><Item><id descrption="層級" name="1" f_chines="編號" t_chines="編號" english="id" value="1">編號</id><levelname descrption="層級" name="" f_chines="層級名稱" t_chines="級別名稱" english="Level-Name" value="層級一">層級名稱</levelname><decrption descrption="層級" name="" f_chines="層級描述" t_chines="級別描述" english="Level-Description" value="層級描述一">描述</decrption><Tchines descrption="層級" name="" f_chines="繁體中文" t_chines="繁體中文" english="T-Chinese" value="級別一">繁體中文</Tchines><english descrption="層級" 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):
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 {//關閉非同步載入xmldoc.async =false;xmldoc.load(xmlUrl);return xmldoc;}catch (e) {alert(e.message);}returnnull;}//將一個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;}}}}//擷取節點及其子節點的文本function getXmlText(oNode) {if (oNode.text) {//IEreturn oNode.tex;}var sText ="";for (var i =0; i < oNode.childNodes.length; i++) { //遍曆子節點if (oNode.childNodes[i].hasChildNodes()) { //是否有子節點sText += getXmlText(oNode.childNodes[i]);} else {sText += oNode[i].childNodes.nodeValue;}}return sText;}//擷取節點及其子節點的字串標識function getXml(oNode) {if (oNode.xml) {//IEreturn 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 docum = loadxml("createInstal.xml");//載入一個xml檔案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的相容,(目前Google瀏覽器沒有辦法用這種方法相容,還待修改)
另外說下FireFox擷取xml的兩種方法:
firefox中JS讀取XML檔案
在網上搜“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、Firefox解析xml文檔
2、Firefox瀏覽器和ie解析xml不一樣節點的值用textContent。
3、並且他會在有的層次child節點(即使用childNodes時)前後都加上"\n"分行符號。(這個搞不清楚為什麼,用firebug調試的時候就是這個樣子,所以寫過的代碼最好測試一下,換個環境就不對了) ,也就是說第1個節點是"\n",第2個節點才是真正的
第一個節點。 第3個節點是"\n",第4個節點才是真正的第二個節點。
根據上述的Firefox的情況,我這裡有個例子避免了使用childNodes,而達到相容性:點擊進入
以上就是小編為大家帶來的js操作XML檔案的實現方法相容IE與FireFox全部內容了,希望大家多多支援幫客之家~