跨瀏覽器處理 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 字串。