我的天空(I Like the feeling)

导航

Javascript支持在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";}
       }
    }
}

posted on 2008-07-05 16:53  TBLANK  阅读(556)  评论(0编辑  收藏  举报