[JavaScript] 相容IE、FireFox、Chrome等瀏覽器的xml處理函數(xml同步/非同步載入、xsl轉換、selectSingleNode、selectNodes)

來源:互聯網
上載者:User

  在編寫處理xml的網頁時,經常為瀏覽器安全色性頭疼。於是我將常用的xml操作封裝為函數。經過一段時間的改進,現在已經很穩定了,用起來很舒服。

 

  函數有——

xml_loadFile:xml同步/非同步載入。

xml_transformNode:xsl轉換。

xml_text:節點的文本。

selectSingleNode:根據XPath選擇單個節點。

selectNodes:根據XPath選擇多個節點。

 

  全部代碼(zyllibjs_xml.js)——

/*

zyllibjs_xml
XML處理
@author zyl910

注意——
1. Chrome 由於其安全機制限制, 不能讀取本地檔案。


Reference
~~~~~~~~~

http://www.jinlie.net/?p=302
Chrome瀏覽器載入XML文檔


Update
~~~~~~

[2011-11-02]
定義。

[2011-11-09]
xml_loadFile: 為回呼函數加上isError參數。

[2011-11-21]
selectSingleNode
selectNodes

*/

// 載入XML檔案並返回XML文檔節點
// return: 成功時返回一個對象(同步模式下返回xml文檔對象,非同步模式下返回操作對象),失敗時返回空。
// xmlUrl: xml檔案的url。
// funcAsync: 回呼函數. function onload(xmlDoc, isError){ ... }
function xml_loadFile(xmlUrl, funcAsync)
{
var xmlDoc = null;
var isChrome = false;
var asyncIs = (null!=funcAsync); // 是否是非同步載入。當funcAsync不為空白時,使用非同步載入,否則是同步載入。

// 檢查參數
if (""==xmlUrl) return null;
if (asyncIs)
{
if ("function"!=typeof(funcAsync)) return null;
}

// 建立XML對象
try
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); // Support IE
}
catch(ex)
{
}
if (null==xmlDoc)
{
try
{
// Support Firefox, Mozilla, Opera, etc
xmlDoc = document.implementation.createDocument("", "", null); // 建立一個空的 XML 文檔對象。
}
catch(ex)
{
}
}
if (null==xmlDoc) return null;

// 載入XML文檔
xmlDoc.async = asyncIs;
if (asyncIs)
{
if(window.ActiveXObject)
{
xmlDoc.onreadystatechange = function(){
if(xmlDoc.readyState == 4)
{
var isError = false;
if (null!=xmlDoc.parseError)
{
isError = (0!=xmlDoc.parseError.errorCode); // 0成功, 非0失敗。
}
funcAsync(xmlDoc, isError);
}
}
}
else
{
xmlDoc.onload = function(){
funcAsync(xmlDoc, false);
}
}
}
try
{
xmlDoc.load(xmlUrl);
}
catch(ex)
{
// alert(ex.message) // 如果瀏覽器是Chrome,則會catch這個異常:Object # (a Document) has no method "load"
isChrome = true;
xmlDoc = null;
}
if (isChrome)
{
var xhr = new XMLHttpRequest();
if (asyncIs) // 非同步
{
xhr.onreadystatechange = function(){
if(xhr.readyState == 4)
{
funcAsync(xhr.responseXML, xhr.status != 200);
}
}
xhr.open("GET", xmlUrl, true);
try // 非同步模式下,由回呼函數處理錯誤。
{
xhr.send(null);
}
catch(ex)
{
funcAsync(null, true);
return null;
}
return xhr; // 注意:返回的是XMLHttpRequest。建議非同步模式下僅用null測試傳回值。
}
else // 同步
{
xhr.open("GET", xmlUrl, false);
xhr.send(null); // 同步模式下,由調用者處理異常
xmlDoc = xhr.responseXML;
}
}

return xmlDoc;
}

// 使用XSLT把XML文檔轉換為一個字串。
function xml_transformNode(xmlDoc, xslDoc)
{
if (null==xmlDoc) return "";
if (null==xslDoc) return "";

if (window.ActiveXObject) // IE
{
return xmlDoc.transformNode(xslDoc);
}
else // FireFox, Chrome
{
//定義XSLTProcesor對象
var xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xslDoc);
// transformToDocument方式
var result=xsltProcessor.transformToDocument(xmlDoc);
var xmls=new XMLSerializer();
var rt = xmls.serializeToString(result);
return rt;
}
}

// 得到節點的文本
function xml_text(xmlNode)
{
if (null==xmlNode) return "";
var rt;
if (window.ActiveXObject) // IE
{
rt = xmlNode.text;
}
else
{
// FireFox, Chrome, ...
rt = xmlNode.textContent;
}
if (null==rt) rt=xmlNode.nodeValue; // XML DOM
return rt;
}

// 添加方法。為了相容FireFox、Chrome。
if (!window.ActiveXObject)
{
XMLDocument.prototype.selectSingleNode = Element.prototype.selectSingleNode = function (xpath)
{
var x = this.selectNodes(xpath)
if ( ! x || x.length < 1 ) return null ;
return x[ 0 ];
}
XMLDocument.prototype.selectNodes = Element.prototype.selectNodes = function (xpath)
{
var xpe = new XPathEvaluator();
var nsResolver = xpe.createNSResolver( this.ownerDocument == null?this.documentElement : this.ownerDocument.documentElement);
var result = xpe.evaluate(xpath, this , nsResolver, 0 , null );
var found = [];
var res;
while (res = result.iterateNext())
found.push(res);
return found;
}
}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.