重构XmlDom对象

前段时间自己尝试了下重构XmlDom对象,但只限于同步方式读取,毕竟还是最初版本.

以下是写好的代码,注释不足恳请原谅!感兴趣的朋友给点意见啊~~^_^!

 

/* -----------------------------------------------
名称:重构XmlDom对象

实现目标:使重构后的XmlDom兼容IE浏览器,FireFox浏览器。

功能:包含selectNodes(),selectSigleNode()两大方法。

备注:此代码只是最初版本,已在IE6.0和FireFox下测试正常。
-------------------------------------------------
*/

var  net  =   new  Object(); // 生成一个Object对象存放所有引用,以免出现重名的情况
net.XMLDOM  =   function (xmlStr,ns){
    
this .xmlStr  =  xmlStr; // XML文本
     this .ns  =  ns; // XML中的命名空间
     this .oXmlDom  =   this .createXMLDOM(); // 生成一个xmldom对象
}

net.XMLDOM.prototype.createXMLDOM 
=   function (){
    
var  oXmlDom  =   null ;
    
// 在IE浏览器下
     if (window.ActiveXObject)
    {
        
// 生成XmlDom对象
         var  progIDs  =  [ " Msxml2.DOMDocument.3.0 " , " Msxml2.DOMDocument " ];
        
for ( var  i  =   0 ;i  <  progIDs.length; ++ i)
        {
            
try
            {
                oXmlDom 
=   new  ActiveXObject(progIDs[i]);
            }
            
catch (e)
            {}
        }
        
// 载入XML文本
        oXmlDom.loadXML( this .xmlStr);
        
// 设置使用XPath语法
        oXmlDom.setProperty( " SelectionLanguage " , " XPath " );
        
// 设置命名空间
         if ( this .ns  !=   null )
        {
            
this .resetNS.call( this );
            oXmlDom.setProperty(
" SelectionNamespaces " , this .ns);
        }
    }
     
// 在FF浏览器下
     else   if (DOMParser)
    {
        
// 载入XML文本以生成XmlDom对象
         var  oParser  =   new  DOMParser();
        oXmlDom 
=  oParser.parseFromString( this .xmlStr, " text/xml " );
        
// 设置命名空间
         if ( this .ns  !=   null )
        {
            
this .resetNS.call( this );
        }
    }
    
return  oXmlDom;
}

// 设置XPath中命名空间的表示方式
net.XMLDOM.prototype.resetNS  =   function (){
    
var  temArr  =   this .ns.split( "   " );
    
// 设置在IE浏览器下,XPath的命名空间的表示方式
     if (window.ActiveXObject)
    {
        
for ( var  i  =   0 ;i < temArr.length; ++ i)
        {
            
var  tem  =  temArr[i].split( " = " );
            temArr[i] 
=   " xmlns: " + tem[ 0 ] + " =" " + tem[ 1 ] + " " " ;
        }
        
this .ns  =  temArr.join( "   " );
    }
    
// 设置在FF浏览器下,XPath中的命名空间的表示方式
     else   if (DOMParser)
    {
        theNS 
=   new  Array();
        
var  tem  =   null ;
        
for ( var  i  =   0 ;i < temArr.length; ++ i)
        {
            tem 
=  temArr[i].split( " = " );
            theNS[tem[
0 ]] = tem[ 1 ];
        }  
    }
}

// 给重构的xmldom添加selectNodes方法,返回一个节点数组
net.XMLDOM.prototype.selectNodes  =   function (xCmd){
    
var  nodes  =   new  Array();
    
// IE浏览器
     if (window.ActiveXObject)
    {
        nodes 
=   this .oXmlDom.selectNodes(xCmd);
    }
    
// FF浏览器
     else   if (DOMParser)
    {
        
var  oEvaluator  =   new  XPathEvaluator();
        
var  xRes  =   null ;
        
if ( this .ns  !=   null )
        {
            xRes 
=  oEvaluator.evaluate(xCmd, this .oXmlDom.documentElement,net.XMLDOM.nsResolver,XPathResult.ANY_TYPE, null );
        }
        
else
        {
            xRes 
=  oEvaluator.evaluate(xCmd, this .oXmlDom.documentElement, null ,XPathResult.ANY_TYPE, null );
            
        }
        
if (xRes  !=   null )
        {
            
var  node  =  xRes.iterateNext();
            
while (node  !=   null )
            {
                nodes.append(node);
                node 
=  xRes.iterateNext();   
            }
        }
    }
    
    
return  nodes;
}
// 给重构的xmldom添加selectSigleNode方法,返回首个节点
net.XMLDOM.prototype.selectSigleNode = function (xCmd){
    
var  nodes  =   this .selectNodes(xCmd);
    
return  nodes[ 0 ];
}

// FF浏览器下的命名空间映射函数处理
var  theNS  =   null ;
net.XMLDOM.nsResolver
= function (prefix){
    
return  theNS[prefix];
}

// 给Array添加append方法
Array.prototype.append  =   function (el){
    
this [ this .length]  =  el;
}

// 以下是测试用代码---------------------------------------------------------------------
function  test()
{
    
var  xmlStr  =   " <bookstore xmlns="http://ccniit.com"><book xmlns="http://sousou.com" category="烹饪"><title>家常菜精选1288例</title><author>傅培梅</author><year>2008</year><price>29.80</price></book></bookstore> " ;
    
var  oXmlDom  =   new  net.XMLDOM(xmlStr, " a=http://ccniit.com b=http://sousou.com " );
    
var  nodes  =  oXmlDom.selectNodes( " /a:bookstore/b:book/b:title " );
    alert(nodes[
0 ].childNodes[ 0 ].nodeValue);
}

window.onload
= function (){
    test();
}
// -------------------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值