支持Firefox的XML读取方法
最近在修改项目的用到
Ajax功能的页面,发现很多写法在
Firefox下都存在问题,主要是因为当时开发时只在IE下测试通过就提交了,而Firefox的写法与IE有很大的区别,主大的问题是当在读取
XML节点或子节点的内容时,IE下一般使用
selectNodes 、
selectSingleNode 这些方法,而Firefox并没有这些方法,所以不能使用,前几天找了好久终于,一直没有找到一个很好的解决方法,很多网站提供的要不就是根本不支持,要不就是使用方法,不方便不实用,今天我终于找到一个很好的解决方法了,我把它弄成一个JS文件,只要引用它就可以像IE一样使用了。
代码如下:
var GetNodeValue = function(obj)
{
var str = "";
if(window.ActiveXObject) //IE
{
str = obj.text;
}
else //Mozilla
{
try
{
str = obj.childNodes[0].nodeValue;
}
catch(ex)
{
str = "";
}
}
return str;
}
if(document.implementation && document.implementation.createDocument)
{
XMLDocument.prototype.loadXML = function(xmlString)
{
var childNodes = this.childNodes;
for (var i = childNodes.length - 1; i >= 0; i--)
this.removeChild(childNodes[i]);
var dp = new DOMParser();
var newDOM = dp.parseFromString(xmlString, "text/xml");
var newElt = this.importNode(newDOM.documentElement, true);
this.appendChild(newElt);
};
// check for XPath implementation
if( document.implementation.hasFeature("XPath", "3.0") )
{
// prototying the XMLDocument
XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
{
if( !xNode ) { xNode = this; }
var oNSResolver = this.createNSResolver(this.documentElement)
var aItems = this.evaluate(cXPathString, xNode, oNSResolver,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
var aResult = [];
for( var i = 0; i < aItems.snapshotLength; i++)
{
aResult[i] = aItems.snapshotItem(i);
}
return aResult;
}
// prototying the Element
Element.prototype.selectNodes = function(cXPathString)
{
if(this.ownerDocument.selectNodes)
{
return this.ownerDocument.selectNodes(cXPathString, this);
}
else{throw "For XML Elements Only";}
}
}
// check for XPath implementation
if( document.implementation.hasFeature("XPath", "3.0") )
{
// prototying the XMLDocument
XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
{
if( !xNode ) { xNode = this; }
var xItems = this.selectNodes(cXPathString, xNode);
if( xItems.length > 0 )
{
return xItems[0];
}
else
{
return null;
}
}
// prototying the Element
Element.prototype.selectSingleNode = function(cXPathString)
{
if(this.ownerDocument.selectSingleNode)
{
return this.ownerDocument.selectSingleNode(cXPathString, this);
}
else{throw "For XML Elements Only";}
}
}
}
只要把以上代码存成一个JS文件,在页面上引用它,当XML节点的读取操作就可以像IE一样使用了,已经通过测试。
Firefox XML读取类下载地址:
http://files.cnblogs.com/huacn/jquery.xml.jsFirefox 读XML演示地址:
http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.htmlFirefox 读XML例子源代码打包下载:
http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.zip
posted on 2007-07-23 14:46
李华顺 阅读(4414)
评论(26) 编辑 收藏 所属分类:
Javascript & Ajax 、
Web标准
发表评论
@阿牛
演示文件我没办法上传呀,只有晚上再发了,做成一个RSS阅读器,Firefox和IE都是支持的,使用了JQuery类库
嗯,其实就是Professional JavaScript for Web Developers书里写的,把FireFox兼容到IE上,写的很具体。
@手机主题
@阿牛
@aysun
@木野狐
例子已跟上,可以看啦,做的一个读取RSS的例子
@Jeffrey Zhao
可惜呀,我不喜欢看书,以前公司买了这种书
需要的时候再用Google找找,再自已弄,不会专门花时间去看书来学。
呵呵 有点临时抱佛脚的感觉,我就感觉就算看了效果也不好,还不如不看,要用的时候再做,哪样我会一下就记住。
楼主可以看看js高级程序设计,那个上面封装得很好的。
请问如何使用啊?
普通的js中,你的实例是在JQuery中调用的,看不懂
@代码乱了
不用Jquery.js都可以的
只要引用jquery.xml.js,XML的读取方式就跟IE是一样的了,主要是在Firefox下面重写了SelectNodes SelectSigleNode这些方法
@李华顺
XMLDocument没有定义把?
能不能做一个简单调用的示例?我现在比较急用,多谢了
@代码乱了
哪个不需要,这个文件只是定义了取的方法,主要是给Ajax用的
XMLDocument多半都是由服务端产生的,用Ajax去读就可以了
@李华顺
对啊,我从服务器端用XMLHttpRequest返回一段xml赋给response变量
这个时候需要去
var xmlDoc=document.all?document.createElement("xml"):document.implementation.createDocument('text/xml','',null);
xmlDoc.async = false;
xmlDoc.loadXML(response);
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//root/Response"));
这段话在IE中是没有问题的
但是如何用你的代码?在firefox下可以正常用?
@代码乱了
你试一下不就知道了
这个jquery.xml.js就是实现了
让这句:
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//root/Response"));
支持Firefox
因为Firefox下面selectSingleNode不是这样用的,这个js文件是重新定义了一个和IE用法一样的方法
@Diligency
晕,我都在项目中一直用的,不知道你怎么用不起了
反正Firefox IE都是可以用的
建议写个普通js的例子,不要jquery
xmlDoc = new ActiveXObject( "Msxml2.DOMDocument" );
xmlDoc.loadXML("rss.xml");
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//root/Response"));
这样不行的啊
xmlDoc = new ActiveXObject( "Msxml2.DOMDocument" );
这一段不对,在Firefox下面是用另外一种方式实现的
$.ajax({dataType:"xml",type:"get",url:rssurl,success:function(xmlDoc)
这句话, 麻烦博主用js表达一下, 我看不懂ajax的东西阿
就是下面的xmlDoc 对象的申明。
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//rss/channel/title"));

不错! 收藏了! 继续努力. selectSingleNode 能否优化一下?