最近項目中用到了xml,需求是用戶安裝產品時先把一系列的數據保存到xml文件中,當執行到最後一步時才寫入數據庫,這樣最大限度的減小了數據庫的訪問,因而不得不糾結在各瀏覽器的兼容性的問題(悲哀啊....)html
進入正文 下面是一個xml文件 (createInstal.xml)node
<?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) {//IE
return 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) {//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 docum = loadxml("createInstal.xml");//加載一個xml文件瀏覽器
var root = docum.documentElement;//根節點dom
var nodelist = root.getElementsByTagName("Items");異步
for(var i=0;i<nodelist[0].childNodes.length;i++)async
{函數
var attr = getxmlnodeattribute(nodeList[0].childNodes[i], "descrption");//獲取這個節點的descrption屬性post
if(attr != "undefined")//目的是兼容FF瀏覽器
{
alert(attr);
}
}
這樣就能保證IE與FF的兼容,(目前谷歌瀏覽器沒有辦法用這種方法兼容,還待修改)
另外說下FireFox獲取xml的兩種方法:
firefox中JS讀取XML文件
在網上搜「firefox中JS讀取XML文件」的方法,找了半天,好 多都是問了沒人答的。看到一堆程序員在抱怨firefox:「除了累死程序員沒什麼好處。」,言歸正傳。firefox不支持ie中的 ActiveXObject對象,要獲得一個XML DOM有如下2種方法:
一、document.implementation.createDocument("", "", null);
二、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對象了。
注意:
一、火狐解析xml文檔
二、火狐瀏覽器和ie解析xml不同節點的值用textContent。
三、而且他會在有的層次child節點(即便用childNodes時)先後都加上"\n"換行符。(這個搞不清楚爲何,用firebug調試的時候就是這個樣子,因此寫過的代碼最好測試一下,換個環境就不對了) ,也就是說第1個節點是"\n",第2個節點纔是真正的第一個節點。 第3個節點是"\n",第4個節點纔是真正的第二個節點。
根據上述的火狐的狀況,我這裏有個例子避免了使用childNodes,而達到兼容性:http://www.cnblogs.com/tianguook/p/4008536.html