支持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 = [];
          
forvar 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.js
Firefox 读XML演示地址:http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.html
Firefox 读XML例子源代码打包下载:http://www.wathon.com/opensource/js/xmlrssreader/xmlrssreader.zip


posted on 2007-07-23 14:46 李华顺 阅读(4414) 评论(26)  编辑 收藏 所属分类: Javascript & AjaxWeb标准

  回复  引用  查看    
2007-07-23 14:53 | 木野狐      
关注
  回复  引用    
2007-07-23 15:21 | aysun [未注册用户]
关注
  回复  引用  查看    
2007-07-23 15:23 | 李华顺      
不能FTP呀,这东西我在网上找了三天,郁闷死了
  回复  引用  查看    
2007-07-23 15:47 | 阿牛      
关注一下

另上传文件,要FTP吗?
  回复  引用  查看    
2007-07-23 16:03 | 李华顺      
@阿牛
演示文件我没办法上传呀,只有晚上再发了,做成一个RSS阅读器,Firefox和IE都是支持的,使用了JQuery类库
  回复  引用    
2007-07-23 16:09 | 手机主题 [未注册用户]
不错,关注一下
  回复  引用  查看    
2007-07-23 19:38 | Jeffrey Zhao      
嗯,其实就是Professional JavaScript for Web Developers书里写的,把FireFox兼容到IE上,写的很具体。
  回复  引用  查看    
2007-07-23 22:20 | 李华顺      
@手机主题
@阿牛
@aysun
@木野狐
例子已跟上,可以看啦,做的一个读取RSS的例子
  回复  引用  查看    
2007-07-23 22:37 | 李华顺      
@Jeffrey Zhao
可惜呀,我不喜欢看书,以前公司买了这种书
需要的时候再用Google找找,再自已弄,不会专门花时间去看书来学。
呵呵 有点临时抱佛脚的感觉,我就感觉就算看了效果也不好,还不如不看,要用的时候再做,哪样我会一下就记住。
  回复  引用  查看    
2007-07-23 23:30 | silverlightfans      
楼主可以看看js高级程序设计,那个上面封装得很好的。
  回复  引用  查看    
2007-07-24 01:04 | Jeffrey Zhao      
@李华顺
建议还是系统的看书,呵呵。
  回复  引用  查看    
2007-09-20 02:34 | 代码乱了      
请问如何使用啊?
普通的js中,你的实例是在JQuery中调用的,看不懂
  回复  引用  查看    
2007-09-20 08:54 | 李华顺      
@代码乱了
不用Jquery.js都可以的
只要引用jquery.xml.js,XML的读取方式就跟IE是一样的了,主要是在Firefox下面重写了SelectNodes SelectSigleNode这些方法
  回复  引用  查看    
2007-09-20 09:39 | 代码乱了      
@李华顺
XMLDocument没有定义把?
能不能做一个简单调用的示例?我现在比较急用,多谢了

  回复  引用  查看    
2007-09-20 09:54 | 李华顺      
@代码乱了
哪个不需要,这个文件只是定义了取的方法,主要是给Ajax用的
XMLDocument多半都是由服务端产生的,用Ajax去读就可以了
  回复  引用  查看    
2007-09-20 10:08 | 代码乱了      
@李华顺
对啊,我从服务器端用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下可以正常用?

  回复  引用  查看    
2007-09-20 10:16 | 李华顺      
@代码乱了
你试一下不就知道了
这个jquery.xml.js就是实现了
让这句:
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//root/Response"));
支持Firefox
因为Firefox下面selectSingleNode不是这样用的,这个js文件是重新定义了一个和IE用法一样的方法

  回复  引用  查看    
2007-09-20 10:22 | 代码乱了      
请问怎么联系你?你的联系方式是?

  回复  引用    
2007-09-24 14:34 | Diligency [未注册用户]
骗人啊,我下了,怎么不好使 呢?
  回复  引用  查看    
2007-09-24 15:23 | 李华顺      
@Diligency
晕,我都在项目中一直用的,不知道你怎么用不起了
反正Firefox IE都是可以用的
  回复  引用  查看    
2007-11-28 15:08 | S.Sams      
可以考虑 XML2Json的组件完成这样的工作.
  回复  引用    
2007-12-17 17:18 | viren [未注册用户]
建议写个普通js的例子,不要jquery
xmlDoc = new ActiveXObject( "Msxml2.DOMDocument" );
xmlDoc.loadXML("rss.xml");
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//root/Response"));


这样不行的啊
  回复  引用  查看    
2007-12-17 18:10 | 李华顺      
xmlDoc = new ActiveXObject( "Msxml2.DOMDocument" );
这一段不对,在Firefox下面是用另外一种方式实现的

  回复  引用    
2007-12-21 18:10 | leeray [未注册用户]
$.ajax({dataType:"xml",type:"get",url:rssurl,success:function(xmlDoc)

这句话, 麻烦博主用js表达一下, 我看不懂ajax的东西阿
就是下面的xmlDoc 对象的申明。
var rssTitle = GetNodeValue(xmlDoc.selectSingleNode("//rss/channel/title"));
  回复  引用    
2008-02-29 16:11 | 西门 [未注册用户]
楼主的方法我试试不行
发个例子到我邮箱?
  回复  引用  查看    
2008-04-23 21:49 | 簡簡單單..      
不错! 收藏了! 继续努力. selectSingleNode 能否优化一下?

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-07-23 22:45 编辑过


相关链接: