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.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, 0null);
         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++){trythis.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);
}

转载于:https://www.cnblogs.com/litsword/archive/2008/04/28/1174038.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值