第一百二十五節,JavaScript,XML

JavaScript,XMLhtml

 

學習要點:node

1.IE中的XML數據庫

2.DOM2中的XMLwindows

3.跨瀏覽器處理XML數組

 

隨着互聯網的發展,Web應用程序的豐富,開發人員愈來愈但願可以使用客戶端來操做XML技術。而XML技術一度成爲存儲和傳輸結構化數據的標準。因此,本章就詳細探討一下JavaScript中使用XML的技術。瀏覽器

對於什麼是XML,幹什麼用的,這裏就不在贅述了,在以往的XHTML或PHP課程都有涉及到,能夠理解成一個微型的結構化的數據庫,保存一些小型數據用的。安全

 

一.IE中的XML服務器

在統一的正式規範出來之前,瀏覽器對於XML的解決方案各不相同。DOM2級提出了動態建立XML DOM規範,DOM3進一步加強了XML DOM。因此,在不一樣的瀏覽器實現XML的處理是一件比較麻煩的事情。app

1.建立XMLDOM對象dom

IE瀏覽器是第一個原生支持XML的瀏覽器,而它是經過ActiveX對象實現的。這個對象,只有IE有,通常是IE9以前採用。微軟當年爲了開發人員方便的處理XML,建立了MSXML庫,但卻沒有讓Web開發人員經過瀏覽器訪問相同的對象。

ActiveXObject()對象,建立xml,ActiveXObject類型,只支持IE,而且只支持IE9如下

var xmlDom = new ActiveXObject('MSXML2.DOMDocument');

 

ActiveXObject類型

XML版本字符串

說明

Microsoft.XmlDom

最初隨同IE發佈,不建議使用

MSXML2.DOMDocument

腳本處理而更新的版本,僅在特殊狀況做爲備份用

MSXML2.DOMDocument.3.0

在JavaScript中使用,這是最低的建議版本

MSXML2.DOMDocument.4.0

腳本處理時並不可靠,使用這個版本致使安全警告

MSXML2.DOMDocument.5.0

腳本處理時並不可靠,使用這個版本致使安全警告

MSXML2.DOMDocument.6.0

腳本可以可靠處理的最新版本

PS:在這六個版本中微軟只推薦三種:

1.MSXML2.DOMDocument.6.0 最可靠最新的版本

2.MSXML2.DOMDocument.3.0 兼容性較好的版本

3.MSXML2.DOMDocument    僅針對IE5.5以前的版本

這三個版本在不一樣的windows平臺和瀏覽器下會有不一樣的支持,那麼爲了實現兼容,咱們應該考慮這樣操做:從6.0->3.0->備用版本這條路線進行實現。

兼容不一樣windows平臺

alert(createXMLDOM());  //執行自定義建立xml對象函數

//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

 

2.載入XML

若是已經獲取了XMLDOM對象,那麼可使用loadXML()和load()這兩個方法能夠分別載入XML字符串或XML文件。

loadXML()載入xml字符串,參數是xml字符串
使用方式:
ActiveXObject()對象.loadXML('參數是xml字符串')

var xml = createXMLDOM();  //建立xml對象
xml.loadXML('<root version="1.0"><user>Lee</user></root>');   //loadXML()載入xml字符串,參數是xml字符串
alert(xml.xml); //XML屬性能夠獲取到xml代碼


//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數,建立xml對象
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

loadXML參數直接就是XML字符串,若是想效果更好,能夠添加換行符\n。.xml屬性能夠序列化XML,獲取整個XML字符串。

 

加載了xml後獲取xml元素和html同樣的

當你已經能夠加載了XML,那麼你就能夠用以前學習的DOM來獲取XML數據,好比標籤內的某個文本。

var xml = createXMLDOM();  //建立xml對象
xml.loadXML('<root version="1.0"><user>Lee</user></root>');   //loadXML()載入xml字符串,參數是xml字符串
var user = xml.getElementsByTagName('user')[0];    //獲取<user>節點
alert(user.tagName);                            //獲取<user>元素標籤
alert(user.firstChild.nodeValue);                //獲取<user>裏的值Le



//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數,建立xml對象
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

 

load()載入xml文件,參數是xml文件路徑
使用方式:
ActiveXObject()對象.load('xml文件路徑')

var xml = createXMLDOM();  //建立xml對象
xmlDom.async = false;  //同步加載,在服務器測試,等待文件加載完畢後在執行代碼
xml.load('demo.xml');   //load()載入xml文件,參數是xml文件路徑
alert(xml.xml);  //打印xml字符串
var user = xml.getElementsByTagName('user')[0];    //獲取<user>節點
alert(user.tagName);                            //獲取<user>元素標籤
alert(user.firstChild.nodeValue);                //獲取<user>裏的值Le



//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數,建立xml對象
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

 

DOM不僅僅能夠獲取XML節點,也能夠建立節點

var xmlDom = createXMLDOM();  //建立xml對象
xmlDom.async = false;  //同步加載,在服務器測試,等待文件加載完畢後在執行代碼
xmlDom.load("demo.xml");  //載入xml文件
var bbb = xmlDom.createElement('bbb');  //添加一個新節點
var root = xmlDom.documentElement;  //獲取根元素
root.appendChild(bbb); //將新節點添加到根節點的子節點末尾
alert(xmlDom.xml);


//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數,建立xml對象
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

 

3.同步及異步

load()方法是用於服務器端載入XML的,而且限制在同一臺服務器上的XML文件。那麼在載入的時候有兩種模式:同步和異步。

所謂同步:就是在加載XML完成以前,代碼不會繼續執行,直到徹底加載了XML再返回。好處就是簡單方便、壞處就是若是加載的數據中止響應或延遲過久,瀏覽器會一直堵塞從而形成假死狀態。【不推薦】

xmlDom.async = false;                        //設置同步,false,能夠用PHP測試假死

所謂異步:就是在加載XML時,JavaScript會把任務丟給瀏覽器內部後臺去處理,不會形成堵塞,但要配合readystatechange事件使用,因此,一般咱們都使用異步方式。

 

xmlDom.async = true;                        //設置異步,默認

 

經過異步加載,咱們發現獲取不到XML的信息。緣由是,它並無徹底加載XML就返回了,也就是說,咱們須要在瀏覽器內部加載一點,返回一點,加載一點,返回一點。這個時候,咱們須要判斷是否徹底加載,而且可使用了,再進行獲取輸出。配合readystatechange事件使用【推薦】

 

XML DOM中onreadystatechange事件

 

就緒狀態

說明

1

DOM正在加載

2

DOM已經加載完數據

3

DOM已經可使用,但某些部分還沒法訪問

4

DOM已經徹底能夠

PS:readyState能夠獲取就緒狀態值

 

onreadystatechange事件,xml對象事件,當加載外部xml文件是激發,經過readyState屬性能夠獲取xml文件加載的狀態,見上表
使用方式:
寫在加載文件的前面
xml對象.onreadystatechange = 執行函數

readyState屬性,能夠獲取到經過onreadystatechange事件加載的xml文件狀態,寫在事件函數裏面,返回狀態碼見上表
使用方式:
xml對象.readyState

解決異步不能加載完畢的問題

var xmlDom = createXMLDOM();  //建立xml對象
xmlDom.async = true; //異步加載
xmlDom.onreadystatechange = function () {  //onreadystatechange事件,xml對象事件,當加載外部xml文件是激發
    if (xmlDom.readyState == 4){  //readyState屬性,能夠獲取到經過onreadystatechange事件加載的xml文件狀態
        //判斷當xml文件加載完畢後,打印出xml裏的代碼
        alert(xmlDom.xml);
    }
};
xmlDom.load("demo.xml");  //載入xml文件



//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數,建立xml對象
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

PS:能夠經過readyState來了解事件的執行次數,將load()方法放到最後不會由於代碼的順序而致使沒有加載。而且load()方法必須放在onreadystatechange以後,才能保證就緒狀態變化時調用該事件處理程序,由於要先觸發

 

雖然能夠經過XML DOM文檔加載XML文件,但公認的仍是XMLHttpRequest對象比較好。這方面內容,咱們在Ajax章節詳細瞭解。

 

2.解析錯誤

在加載XML時,不管使用loadXML()或load()方法,都有可能遇到XML格式不正確的狀況。爲了解決這個問題,微軟的XML DOM提供了parseError屬性。

parseError屬性對象

屬性

說明

errorCode

發生的錯誤類型的數字代號,沒有錯誤返回0

filepos

發生錯誤文件中的位置

line

錯誤行號

linepos

遇到錯誤行號那一行上的字符的位置

reason

錯誤的解釋信息

parseError屬性對象,是處理加載xml文件時遇到錯誤的對象,對象下有5個屬性分別返回錯誤類型,見上表

 

使用方式:
xml對象.parseError.錯誤屬性

var xmlDom = createXMLDOM();  //建立xml對象
xmlDom.async = true; //異步加載
xmlDom.onreadystatechange = function () {  //onreadystatechange事件,xml對象事件,當加載外部xml文件是激發
    if (xmlDom.readyState == 4) {  //readyState屬性,能夠獲取到經過onreadystatechange事件加載的xml文件狀態
        //判斷當xml文件加載完畢後,執行裏面代碼
        if (xmlDom.parseError.errorCode == 0) {  //判斷文件是否有錯
            //若是沒有錯誤,打印出xml代碼
            alert(xmlDom.xml);
        } else {  //若是有錯誤
            //建立一個錯誤對象,打印出相應的錯誤類型
            throw new Error('錯誤行號:' + xmlDom.parseError.line +
                '\n錯誤代號:' + xmlDom.parseError.errorCode +
                '\n錯誤解釋:' + xmlDom.parseError.reason);
        }
    }
};
xmlDom.load("demo.xml");  //載入xml文件



//兼容不一樣windows平臺
function createXMLDOM() {  //自定義函數,建立xml對象
    var version = [   //建立數組,元素是ActiveXObject類型
                            'MSXML2.DOMDocument.6.0',
                            'MSXML2.DOMDocument.3.0',
                            'MSXML2.DOMDocument'
    ];
    for (var i = 0; i < version.length; i ++) {  //根據數組的長度循環次數
        try {  //嘗試執行循環到的ActiveXObject類型
            var xmlDom = new ActiveXObject(version[i]);  //執行成功
            return xmlDom;  //返回建立xml對象,而且退出當前函數
        } catch (e) {  //若是出錯
            //跳過
        }
    }
    //建立一個錯誤對象,拋出錯誤
    throw new Error('您的系統或瀏覽器不支持MSXML!');        //循環後拋出錯誤
}

 

二.DOM2中的XML

 DOM2中沒法實現字符串方式建立xml對象

IE能夠實現了對XML字符串或XML文件的讀取,其餘瀏覽器也各自實現了對XML處理功能。DOM2級在document.implementaion中引入了createDocument()方法。IE九、Firefox、Opera、Chrome和Safari都支持這個方法。

implementaion對象,xml對象
使用方式;
document.implementaion.createDocument()

createDocument()方法,建立xml對象,3個參數,參數一命名空間xml沒有命名空間留空字符串,參數二xml根標籤,參數三文檔聲明,沒有文檔聲明寫null
使用方式:
document.implementaion.createDocument('',xml根標籤,null)

1.建立XMLDOM對象

//1.建立XMLDOM對象
var xmlDom = document.implementation.createDocument('','root',null);    //建立xmlDom
var us = xmlDom.createElement('us');                            //建立us新元素節點
xmlDom.getElementsByTagName('root')[0].appendChild(us);            //將新元素節點添加到root下
var value = xmlDom.createTextNode('Lee');                        //建立文本節點
xmlDom.getElementsByTagName('us')[0].appendChild(value);        //將文本節點添加到us下
alert(xmlDom.getElementsByTagName('root')[0].tagName);  //打印出根元素的標籤名稱
alert(xmlDom.getElementsByTagName('us')[0].firstChild.nodeValue); //打印出user元素的標籤下的文本節點值

PS:因爲DOM2中不支持loadXML()方法,因此,沒法簡易的直接建立XML字符串。因此,只能採用以上的作法。

PS:createDocument()方法須要傳遞三個參數,命名空間,根標籤名和文檔聲明,因爲JavaScript管理命名空間比較困難,因此留空便可。文檔聲明通常根本用不到,直接null便可。命名空間和文檔聲明留空,表示建立XMLDOM對象不須要命名空間和文檔聲明。

PS:命名空間的用途是防止太多的重名而進行的分類,文檔類型代表此文檔符合哪一種規範,而這裏建立XMLDOM不須要使用這兩個參數,因此留空便可。

 

2.載入XML

DOM2只支持load()方法,載入一個同一臺服務器的外部XML文件。固然,DOM2也有async屬性,來表面同步或異步,默認異步。

無論在同步或異步來獲取load()方法只有Mozilla的Firefox才能支持,只不過新版的Opera也是支持的,其餘瀏覽器則不支持

同步狀況下

//同步狀況下
var xmlDom = document.implementation.createDocument('','root',null);  //建立xml對象
xmlDom.async = false; //加載文件方式同步,加載XML完成以前,代碼不會繼續執行,直到徹底加載了XML再返回
xmlDom.load('demo.xml'); //加載xml文件
alert(xmlDom.getElementsByTagName('user')[0].tagName);  //獲取user標籤的,標籤名稱

異步狀況下

//異步狀況下
var xmlDom = document.implementation.createDocument('', 'root', null);
xmlDom.async = true;  //異步
addEvent(xmlDom, 'load', function () {                    //異步直接用onload便可,等待頁面加載完畢後執行函數
    alert(this.getElementsByTagName('user')[0].tagName);  //打印當前xml對象裏,user元素的,標籤名稱
});
xmlDom.load('demo.xml'); //加載xml文件


//跨瀏覽器添加事件,添加事件兼容
function addEvent(obj, type, fn) {     //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數
    //判斷瀏覽器若是支持w3c
    if (obj.addEventListener) {
        //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件
        obj.addEventListener(type, fn, false);
    } else if (obj.attachEvent) {   //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件
        //將事件名稱和事件函數傳入建立對象
        obj.attachEvent('on' + type, fn);
    }
}

PS:無論在同步或異步來獲取load()方法只有Mozilla的Firefox才能支持,只不過新版的Opera也是支持的,其餘瀏覽器則不支持。

 

 

3.DOMParser類型,用於定義字符串方式xml

因爲DOM2沒有loadXML()方法直接解析XML字符串,因此提供了DOMParser類型來建立XML DOM對象。IE九、Safari、Chrome和Opera都支持這個類型。DOMParser下面有一個方法parseFromString()建立xml對象

parseFromString()方法,建立xml對象,用於建立DOMParser類型的xml對象,有兩個參數,參數一是xml字符串,參數二是xml類型text/xml

使用方式:

DOMParser對象.parseFromString(xml字符串,'text/xml')

var xmlParser = new DOMParser();                        //建立DOMParser對象
//建立xml字符串
var xmlStr = '<root><user>Lee</user></root>';    //XML字符串
var xmlDom = xmlParser.parseFromString(xmlStr, 'text/xml');    //建立XML DOM對象
alert(xmlDom.getElementsByTagName('user')[0].tagName);    //獲取user元素標籤名

PS:XML DOM對象是經過DOMParser對象中的parseFromString方法來建立的,兩個參數:XML字符串和內容類型text/xml。

 

4.XMLSerializer類型,用於序列化XML輸出

因爲DOM2沒有序列化XML的屬性,因此提供了XMLSerializer類型來幫助序列化XML字符串。IE九、Safari、Chrome和Opera都支持這個類型。XMLSerializer類型下面有一個serializeToString()方法序列化XML

serializeToString()方法,用於序列化XML輸出,有一個參數xml對象DOM

使用方式:

XMLSerializer對象.serializeToString(xml對象DOM)

var xmlParser = new DOMParser();                        //建立DOMParser對象
//建立xml字符串
var xmlStr = '<root><user>Lee</user></root>';    //XML字符串
var xmlDom = xmlParser.parseFromString(xmlStr, 'text/xml');    //建立XML DOM對象

var serializer = new XMLSerializer();            //建立XMLSerializer對象
var xml = serializer.serializeToString(xmlDom);    //序列化XML
alert(xml); //序列化打印出xml

 

5.解析錯誤

在DOM2級處理XML發生錯誤時,並無提供特有的對象來捕獲錯誤,而是直接生成另外一個錯誤的XML文檔,經過這個文檔能夠獲取錯誤信息。

var xmlParser = new DOMParser();                        //建立DOMParser對象
//建立xml字符串
var xmlStr = '<user>Lee</user></root>';    //XML字符串
var xmlDom = xmlParser.parseFromString(xmlStr, 'text/xml');    //建立XML DOM對象

var serializer = new XMLSerializer();            //建立XMLSerializer對象
var xml = serializer.serializeToString(xmlDom);    //序列化XML
//獲取xml錯誤序列化後的錯誤文件parsererror標籤,標籤裏面是錯誤信息
var errors = xmlDom.getElementsByTagName('parsererror');
if (errors.length > 0) {  //判斷錯誤文件標籤大於0說明xml有錯誤
    //建立一個錯誤對象,獲取第一個parsererror標籤,而且獲取到標籤的文本內容
    throw new Error('XML格式有誤:' + errors[0].textContent);
}

alert(xml); //序列化打印出xml,若是出錯會獲得一個錯誤文件

PS:errors[0].firstChild.nodeValue也可使用errors[0].textContent來代替。

 

三.跨瀏覽器處理XML

若是要實現跨瀏覽器就要思考幾個個問題:1.load()只有IE、Firefox、Opera支持,因此沒法跨瀏覽器;2.獲取XML DOM對象順序問題,先判斷先進的DOM2的,而後再去判斷落後的IE;3.針對不一樣的IE和DOM2級要使用不一樣的序列化。4.針對不一樣的報錯進行不一樣的報錯機制。

var xml = '<root><user>Lee</user></root>';  //定義xml字符串
var xmldom = getXMLDOM(xml); //建立XML DOM對象,接收xml字符串
alert(serializeXML(xmldom)); //打印序列化xml,接收XML DOM對象


//首先,咱們須要跨瀏覽器獲取XML DOM
function getXMLDOM(xmlStr) {  //自定義跨瀏覽器建立xml DOM對象,接收一個參數xml字符串
    var xmlDom = null;  //初始化一個對象

    if (typeof window.DOMParser != 'undefined') {        //判斷DOMParser類型不等於undefined說明支持
        //建立DOMParser對象,而且建立xml DOM對象
        xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');
        //獲取錯誤信息的parsererror標籤
        var errors = xmlDom.getElementsByTagName('parsererror');
        //判斷錯誤信息標籤返回集合長度大於0,說明xml有錯誤
        if (errors.length > 0) {
            //建立一個錯誤對象,獲取到第一個錯誤標籤,而且獲取到他的文本內容
            throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);
        }
    //若是不支持DOMParser類型,嘗試IE的方法
    } else if (typeof window.ActiveXObject != 'undefined') {    //判斷ActiveXObject類型不等於undefined說明支持
        var version = [  //建立一個數組,元素分別爲3個xml版本
            'MSXML2.DOMDocument.6.0',
            'MSXML2.DOMDocument.3.0',
            'MSXML2.DOMDocument'
        ];
        for (var i = 0; i < version.length; i++) {  //根據數組的長度循環次數
            try {
                //嘗試着執行每次循環到的xml版本,建立xml對象
                xmlDom = new ActiveXObject(version[i]);
            } catch (e) {  //若是出錯跳過執行第二次循環
                //跳過
            }
        }
        xmlDom.loadXML(xmlStr);  //載入xml字符串
        if (xmlDom.parseError != 0) {  //判斷載入xml錯誤返回代碼,若是不等於0說明xml有錯
            //建立一個錯誤對象,返回錯誤的解釋信息
            throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);
        }
    } else {  //若是 上面兩種方式都不支持
        //建立一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!
        throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');
    }

    return xmlDom;  //最後返回建立的xmlDOM對象
}

//其次,咱們還必須跨瀏覽器序列化XML
function serializeXML(xmlDom) {  //序列化xml函數,接收xmlDOM對象對象
    var xml = '';  //初始化一個變量等於空字符串
    if (typeof XMLSerializer != 'undefined') {  //判斷XMLSerializer類型,不等於undefined,說明支持序列化
        //給xml從新賦值,建立XMLSerializer對象,而且使用serializeToString方法序列化
        xml = (new XMLSerializer()).serializeToString(xmlDom);
    //若是不支持XMLSerializer類型
    } else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等於undefined,不等於說明支持
        //給xml從新賦值,序列化xml
        xml = xmlDom.xml;
    } else { //若是上面兩種都不支持
        //建立一個錯誤對象,拋出沒法解析XML!錯誤信息
        throw new Error('沒法解析XML!');
    }
    return xml; //最後返回序列化
}

PS:因爲兼容性序列化過程有必定的差別,可能返回的結果字符串可能會有一些不一樣。至於load()加載XML文件則由於只有部分瀏覽器支持而沒法跨瀏覽器。

相關文章
相關標籤/搜索