js异步读取xml(支持ff和xpath)
摘要:在各种论坛上用谷歌搜索了一整天之后,我们终于调试成功了。
在各大论坛间google了一整天,东拼西凑的终于调试成功了。
首先,定义一个全局变量用于识别当前浏览器是否IE

全局变量
var _isIe = navigator.appName == "Microsoft Internet Explorer" ? true : false; 针对xml对象在Firefox里的不同属性进行转换,统一接口

if (!_isIe)
{
var ex;

XMLDocument.prototype.__proto__.__defineGetter__("xml" ,function ()
{

try
{
return new XMLSerializer().serializeToString(this);

} catch (ex)
{
var d = document.createElement("div");
d.appendChild(this.cloneNode( true ));
return d.innerHTML;
}
});

Element.prototype.__proto__.__defineGetter__("xml", function ()
{

try
{
return new XMLSerializer().serializeToString(this);

} catch (ex)
{
var d = document.createElement("div");
d.appendChild(this.cloneNode(true));
return d.innerHTML;
}
});

XMLDocument.prototype.__proto__.__defineGetter__("text", function ()
{
return this.firstChild.textContent;
});

Element.prototype.__proto__.__defineGetter__("text", function ()
{
return this.textContent;
});


XMLDocument.prototype.selectSingleNode = Element.prototype.selectSingleNode = function (XPath)
{
alert("selectSingleNode");
var x = this.selectNodes(xpath);
alert(x);
alert(x.length);
if ( !x || x.length < 1 ) return null;
return x[0];
}

XMLDocument.prototype.selectNodes = Element.prototype.selectNodes = function (xpath)
{
alert("selectNodes");
var xpe = new XPathEvaluator();
alert("1");
var nsResolver = xpe.createNSResolver(this.ownerDocument == null ? this.documentElement : this.ownerDocument.documentElement);
alert("2");
var result = xpe.evaluate(xpath, this, nsResolver, 0, null);
alert("3");
var found = [];
var res;
while (res = result.iterateNext())
found.push(res);
return found;
}

Node.prototype.transformNode = function (oXslDom)
{
var oProcessor = new XSLTProcessor();
oProcessor.importStylesheet(oXslDom);
var oResultDom = oProcessor.transformToDocument(this);
var sResult = oResultDom.xml;

if (sResult.indexOf(" <transformiix:result") > -1)
{
sResult = sResult.substring(sResult.indexOf("> ") + 1, sResult.lastIndexOf(" <"));
}
return sResult;
};
} 相关函数如下:

相关函数
/// <summary>创建xml对象</summary>
/// <returns>返回创建成功的xml对象</returns>
function createDomDoc()


{
if(_isIe)

{
var signatures=["Msxml2.DOMDocument.5.0","Msxml2.DOMDocument.4.0","Msxml2.DOMDocument.3.0","Msxml2.DOMDocument","Microsoft.XmlDom"];

for(var i=0;i<signatures.length;i++)
{try
{ this.domDoc=new ActiveXObject(signatures[i]);return this.domDoc;}catch(e)
{}}
return null;
}
else

{
return document.implementation.createDocument("","",null);
}
}

/// <summary>根据xpath取符合条件的节点集合</summary>
/// <param name="domDoc">xml对象</param>
/// <param name="xpath">xpath语句</param>
/// <returns>返回符合条件的节点集合</returns>
function selectNodes(domDoc, xpath)


{
if (_isIe)
return domDoc.selectNodes(xpath) ;

else
{
var aNodeArray = new Array();
var xPathResult = domDoc.evaluate(xpath, domDoc, domDoc.createNSResolver(domDoc.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;

if (xPathResult)
{
var oNode = xPathResult.iterateNext() ;

while(oNode)
{
aNodeArray[aNodeArray.length] = oNode ;
oNode = xPathResult.iterateNext();
}
}
return aNodeArray ;
}
}

/// <summary>返回xml对象的内容字符串</summary>
/// <param name="domDoc">xml对象</param>
/// <returns>返回xml对象的内容字符串</returns>

function lookXml(domDoc)
{

if(_isIe)
{return domDoc.xml;}

else
{
var serializer=new XMLSerializer();
var xml=serializer.serializeToString(domDoc);
return xml;
}
}

/// <summary>根据url异步加载xml对象</summary>
/// <param name="domDoc">传入创建好的xml对象</param>
/// <param name="url">xml文件存在的地址(有人说此方法只能访问本服务器上的文件,尚未验证)</param>
/// <param name="fun">加载成功后执行的函数名(带一个xml对象参数)</param>
/// <returns>无</returns>
function loadByUrl(domDoc, url, fun)


{
domDoc.async = true;
if(_isIe)

{
domDoc.onreadystatechange = function()

{
//alert(domDoc.readyState);
if (domDoc.readyState == 4)

{
//alert("readyState载入完毕!");
fun(domDoc);
}
}
}
else

{
domDoc.onload = function(success)

{
if(success)

{
//alert("onload加载完成。");
fun(domDoc);
}
}
}
domDoc.load(url);
}

/// <summary>获取节点的内容</summary>
/// <param name="obj">xml节点对象</param>
/// <returns>返回节点内的值</returns>
function getText(obj)


{
return obj.firstChild.nodeValue;
}

/// <summary>获取节点属性</summary>
/// <param name="obj">xml节点对象</param>
/// <param name="key">属性名</param>
/// <returns>返回节点指定属性的值</returns>
function getKey(obj, key)


{
var o=obj.getAttribute(key);
return o==null?"":o;
}

/// <summary>设置节点的内容</summary>
/// <param name="obj">xml节点对象</param>
/// <param name="text">要写入节点的内容</param>
/// <returns>无</returns>
function setText(obj, text)


{
obj.firstChild.nodeValue=text;
}

/// <summary>设置节点的属性</summary>
/// <param name="obj">xml节点对象</param>
/// <param name="key">属性名</param>
/// <param name="text">要写入节点属性的内容</param>
/// <returns>无</returns>
function setKey(obj, key, text)


{
obj.setAttribute(key,text);
}免责声明:文章转载自《js异步读取xml(支持ff和xpath)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。
上篇[转帖]javascript版 UrlEncode和UrlDecode函数BCB6 E2494 Unrecognized __declspec modifier下篇
宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=