重构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、付费专栏及课程。

余额充值