1. 程式人生 > >跨瀏覽器處理 XML

跨瀏覽器處理 XML

一、解析XML

很少有開發人員能夠有福氣專門針對一款瀏覽器做開發。因此,編寫能夠跨瀏覽器處理 XML 的函式就成為了常見的需求。對解析 XML 而言,下面這個函式可以在所有四種主要瀏覽器中使用。

function parseXml(xml){
    var xmldom = null; 

    if (typeof DOMParser != "undefined"){
        xmldom = (new DOMParser()).parseFromString(xml, "text/xml");
        var errors = xmldom.getElementsByTagName("parsererror");
        if (errors.length){
            throw new Error("XML parsing error:" + errors[0].textContent);
        }

    } else if (typeof ActiveXObject != "undefined"){
        xmldom = createDocument();
        xmldom.loadXML(xml);
        if (xmldom.parseError != 0){
            throw new Error("XML parsing error: " + xmldom.parseError.reason);
        }

    } else {
        throw new Error("No XML parser available.");
    }

    return xmldom;
}

這個parseXml()函式只接收一個引數,即可解析的 XML 字串。在函式內部,我們通過能力檢測來確定要使用的 XML 解析方式。DOMParser型別是受支援最多的解決方案,因此首先檢測該型別是否有效。如果是,則建立一個新的DOMParser物件,並將解析 XML 字串的結果儲存在變數xmldom中。由於DOMParser物件在發生解析錯誤時不丟擲錯誤(除 IE9+ 之外),因此還要檢測返回的文件以確定解析過程是否順利。如果發現瞭解析錯誤,則根據錯誤訊息丟擲一個錯誤。

函式的最後一部分程式碼檢測了對 ActiveX 的支援,並使用前面定義的createDocument()函式來建立適當版本的 XML 文件。與使用DOMParser

時一樣,這裡也需要檢測結果,以防有錯誤發生。如果確實有錯誤發生,同樣也需要丟擲一個包含錯誤原因的錯誤。

如果上述 XML 解析器都不可用,函式就會丟擲一個錯誤,表示無法解析了。

在使用這個函式解析 XML 字串時,應該將它放在try-catch語句當中,以防發生錯誤。來看下面的例子。

var xmldom = null;

try {
    xmldom = parseXml("<root><child/></root>");
} catch (ex){
    alert(ex.message);
}

//進一步處理

二、序列化XML

對序列化 XML 而言,也可以按照同樣的方式編寫一個能夠在四大瀏覽器中執行的函式。例如:

function serializeXml(xmldom){

    if (typeof XMLSerializer != "undefined"){
        return (new XMLSerializer()).serializeToString(xmldom);

    } else if (typeof xmldom.xml != "undefined"){
        return xmldom.xml;
    } else {
        throw new Error("Could not serialize XML DOM.");
    }
}

這個serializeXml()函式接收一個引數,即要序列化的 XML DOM 文件。與parseXml()函式一樣,這個函式首先也是檢測受到最廣泛支援的特性,即XMLSerializer。如果這個型別有效,則使用它來生成並返回文件的 XML 字串。由於 ActiveX 方案比較簡單,只使用了一個xml屬性,因此這個函式直接檢測了該屬性。如果上述兩方面嘗試都失敗了,函式就會丟擲一個錯誤,說明序列化不能進行。一般來說,只要針對瀏覽器使用了適當的 XML DOM 物件,就不會出現無法序列化的情況,因而也就沒有必要在try-catch語句中呼叫serializeXml()。結果,就只需如下一行程式碼即可:

var xml = serializeXml(xmldom);

注意:只不過由於序列化過程的差異,相同的 DOM 物件在不同的瀏覽器下,有可能會得到不同的 XML 字串。