zoukankan      html  css  js  c++  java
  • 类似查询mysql数据库的查询XML的JS类

    一个快捷操作XML数据库的Javascript接口对象,包含select、count、tables、fields等方法,能够像操作mysql等其它数据库一样操作XML数据库。

      1 if(document.implementation.hasFeature("XPath","3.0")){ //浏览器bug修复
      2    XMLDocument.prototype.selectNodes=function(cXPathString,xNode){
      3       if(!xNode){xNode=this;}
      4       var oNSResolver=this.createNSResolver(this.documentElement);
      5       var aItems=this.evaluate(cXPathString, xNode, oNSResolver,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
      6       var aResult=[];
      7       for(var i=0;i< aItems.snapshotLength;i++){
      8          aResult[i]=aItems.snapshotItem(i);
      9       }
     10       return aResult;
     11    }
     12    Element.prototype.selectNodes=function(cXPathString){
     13       if(this.ownerDocument.selectNodes){
     14          return this.ownerDocument.selectNodes(cXPathString,this);
     15       }else{throw "For XML Elements Only";}
     16    }
     17 }
     18 /*
     19 jQuery版本要求:1.7.2
     20 XML数据库查询类,实现的方法
     21 load(pt,async):
     22 loadFromText(xStr):
     23 select(tb,data,where,order,limit,group);
     24 count(tb,where);
     25 tables();
     26 fields(tb);
     27 */
     28 function xml_db(pt,async){
     29     var _root=this,async=typeof(async)!="undefined"?async:true;
     30     _root.dbObj=null;/*数据库对象数组*/
     31     _root.status=false;/*数据库对象数组*/
     32     _root.dbpath=typeof(pt)!="undefined"?pt:false;/*数据库路径*/
     33   _root.ifAutoPara=true;
     34 
     35   var autoPara=function(para,oriParas){/*自动附加参数*/
     36         if(para.length >2){
     37            for(var i=2;i< para.length;i++){
     38               if(para[i].match(/^s*where/i)){oriParas['where']=para[i];}
     39               if(para[i].match(/^s*order/i)){oriParas['order']=para[i];}
     40               if(para[i].match(/^s*limit/i)){oriParas['limit']=para[i];}
     41               if(para[i].match(/^s*group/i)){oriParas['group']=para[i];}
     42            }
     43         }
     44   },
     45   WOLG=function(str,kw,oriParas){/*附加参数*/
     46           if(typeof(str)!="undefined"){
     47         var reg=new RegExp("^"+kw+"\s*","ig"),ky=kw.replace(/s+w+/gi,"");
     48         str=str.replace(reg,"");
     49         oriParas[ky]=kw+" "+str;
     50           }
     51   },
     52   decode=function(string,quote_style){/*解码*/
     53         var optTemp=0,i=0,noquotes=false;
     54         if(typeof quote_style === 'undefined'){quote_style=2;}
     55         string=string.toString().replace(/</g, '<').replace(/>/g, '>');
     56         var OPTS={'ENT_NOQUOTES': 0,'ENT_HTML_QUOTE_SINGLE': 1,'ENT_HTML_QUOTE_DOUBLE':2,'ENT_COMPAT':2,'ENT_QUOTES':3,'ENT_IGNORE':4};
     57         if(quote_style===0){noquotes=true;}
     58         if(typeof quote_style !== 'number'){
     59         quote_style=[].concat(quote_style);
     60         for(i=0; i < quote_style.length; i++){
     61           if(OPTS[quote_style[i]] === 0){
     62               noquotes=true;
     63           }else if(OPTS[quote_style[i]]){
     64               optTemp=optTemp | OPTS[quote_style[i]];
     65           }
     66         }
     67         quote_style=optTemp;
     68         }
     69         if(quote_style & OPTS.ENT_HTML_QUOTE_SINGLE){
     70         string=string.replace(/�*39;/g, "'");
     71         string=string.replace(/'|�*27;/g, "'");
     72         }
     73         if(!noquotes){string=string.replace(/"/g, '"');}
     74         string=string.replace(/&/g, '&');
     75         return string;
     76   },
     77   xQuery=function(str,node){
     78       return  typeof(node)!="undefined"? node.selectNodes(str):_root.dbObj.selectNodes(str);
     79   };
     80 
     81   _root.load=function(pt,async){
     82        var pt=typeof(pt)!="undefined"?pt:_root.dbpath,
     83            async=typeof(async)!="undefined"?async:true;
     84      jQuery.ajax({
     85            'type': "GET",
     86               'url':pt,
     87               'dataType':'text',
     88               'cache': false,
     89               'async': async,
     90               'success': function(dt){
     91                     var root=_root.loadFromText(dt.replace(/[
    ]+/gmi,"").replace(/<!--.*?-->/gi,"").replace(/>s+/gi,">"));
     92                     if(root){
     93                       _root.dbObj=root.documentElement;
     94                     }
     95               }
     96             });
     97   };
     98 
     99   _root.loadFromText=function (xStr){
    100       try{
    101             if(window.DOMParser){
    102               parser=new DOMParser();
    103               txmlDoc=parser.parseFromString(xStr,"text/xml");
    104             }else{
    105               txmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    106               txmlDoc.async="false";
    107               txmlDoc.loadXML(xStr);
    108             }
    109             _root.status=txmlDoc.documentElement?true:false;
    110             return _root.status?txmlDoc:false;
    111         }catch(e){
    112       _root.status=false;
    113       return false;
    114         }
    115   };
    116 
    117   _root.query=function(){
    118 
    119   };
    120 
    121   _root.select=function(tb,data,where,order,limit,group){
    122       if(!_root.status){return false;}
    123       var addtion={},data=typeof(data)=="undefined"?"*":data;
    124     if(!_root.ifAutoPara){ /*自动附加参数*/
    125        autoPara(arguments,addtion);
    126     }else{
    127        WOLG(where,"where",addtion);
    128        WOLG(order,"order by",addtion);
    129        WOLG(limit,"limit",addtion);
    130        WOLG(group,"group by",addtion);
    131     }
    132 
    133     if(typeof(addtion['where'])=="undefined"){
    134         addtion['where']="where `id`>=0";
    135     }
    136     addtion['where']=addtion['where'].replace(/&&/gi," and ").replace(/||/gi," or ");
    137     addtion['where']=addtion['where'].replace(/^s*wheres*/gi,"");
    138 
    139     var fdArr=_root.fields(tb),sFdArr,reg=new RegExp(),oArr,rArr=[];/*相关变量定义*/
    140 
    141     if(data!="*"){
    142       sFdArr=jQuery.grep(
    143           jQuery.type(data)=="array"?data:data.split(/s*,s*/gi),function(n,i){
    144           return jQuery.inArray(n,fdArr)!=-1;
    145           });
    146       if(!sFdArr.length){return false;}
    147       if(jQuery.inArray("id",sFdArr)==-1){sFdArr.push("id");}
    148     }
    149     jQuery.each(fdArr,function(i,n){
    150         reg.compile('`'+n+'`',"gi");
    151       addtion['where']=addtion['where'].replace(reg,"v"+i);
    152     });
    153     oArr=xQuery("//root/"+tb+"/it["+addtion['where']+"]");
    154     jQuery.each(oArr,function(i,n){
    155       var orArr={};
    156       jQuery.each(n.childNodes,function(dx,cNode){
    157         var curVL=jQuery(cNode).text();
    158         curVL=curVL.match(/^d+$/,"gi")?parseInt(curVL):(curVL.match(/^d+.d+$/,"gi")?parseFloat(curVL):decode(curVL));
    159         if(data=="*"){
    160           orArr[fdArr[dx]]=curVL;
    161         }else if(jQuery.inArray(fdArr[dx],sFdArr)!=-1){
    162           orArr[fdArr[dx]]=curVL;
    163         }
    164       });
    165       rArr.push(orArr);
    166     });
    167 
    168     if(typeof(addtion['order'])!="undefined"){
    169       if(addtion['order'].match(/^s*orders+bys+`?(w+)`?s+(asc|desc)s*$/gi)){
    170           var orders=[];
    171         orders[0]=(jQuery.inArray(RegExp.$1.toString(),fdArr)!=-1)?RegExp.$1.toString():"id";
    172         orders[1]=(jQuery.inArray(RegExp.$2.toString(),["desc","asc"])!=-1)?RegExp.$2.toString():"desc";
    173         rArr.sort(function(a,b){
    174            var ca=0,cb=0;
    175            if(a[orders[0]].toString().match(/^d+$/gi)&&b[orders[0]].toString().match(/^d+$/gi)){
    176              ca=parseInt(a[orders[0]]);cb=parseInt(b[orders[0]]);
    177            }else if(a[orders[0]].toString().match(/^d+.d+$/gi)&&b[orders[0]].toString().match(/^d+.d+$/gi)){
    178              ca=parseFloat(a[orders[0]]);cb=parseFloat(b[orders[0]]);
    179            }else{
    180              ca=a[orders[0]];cb=b[orders[0]];
    181            }
    182            if(ca==cb)return 0;
    183                     if(orders[1].toLowerCase()=='asc'){
    184                       return (ca > cb)? 1 : -1;
    185                     }else{
    186                         return (ca < cb)? 1 : -1;
    187                     }
    188         });
    189       }
    190     };
    191     if(typeof(addtion['limit'])!="undefined"){
    192       if(addtion['limit'].match(/^s*limits+(d+)s*,s*(d+)s*$/gi)){
    193         var itemsnum=rArr.length,snum=parseInt(RegExp.$1),lenum=parseInt(RegExp.$2);
    194         snum=(snum < 0) ? 0:(snum < itemsnum ? snum : (itemsnum-1));
    195                 rArr2=[];
    196                 for(var i=0;i< itemsnum;i++){
    197                     if(i >= snum && i <= (snum+lenum-1)){
    198                       rArr2.push(rArr[i]);
    199                     }
    200                 }
    201                 return rArr2;
    202       }
    203     }
    204     return rArr;
    205   };
    206 
    207   _root.count=function(tb,where){
    208       if(!_root.status){return false;}
    209     var fdArr=_root.fields(tb),reg=new RegExp(),addtion={};
    210     WOLG(where,"where",addtion);
    211     if(typeof(addtion['where'])=="undefined"){
    212         addtion['where']="where `id`>=0";
    213     }
    214     addtion['where']=addtion['where'].replace(/&&/gi," and ").replace(/||/gi," or ");
    215     addtion['where']=addtion['where'].replace(/^s*wheres*/gi,"");
    216     jQuery.each(fdArr,function(i,n){
    217         reg.compile('`'+n+'`',"gi");
    218       addtion['where']=addtion['where'].replace(reg,"v"+i);
    219     });
    220     return xQuery("//root/"+tb+"/it["+addtion['where']+"]").length;
    221   };
    222 
    223   _root.fields=function(tb){
    224       if(!_root.status){return false;}
    225     var tbInfo=xQuery('//root/'+tb);
    226     return tbInfo.length >0 ? tbInfo[0].getAttribute("fd").split("|"):[];
    227   };
    228 
    229   _root.tables=function(){
    230       if(!_root.status){return false;}
    231       var tbArr=[];
    232     jQuery.each(xQuery('//root')[0].childNodes,function(dx,n){
    233       tbArr.push(n.tagName);
    234     });
    235     return tbArr;
    236   }
    237 
    238   if(_root.dbpath!==false){
    239     _root.load(_root.dbpath,async);
    240   }
    241 
    242 }

    XML数据库文件格式(文件名为:db.xml):

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
     <menu fd="id|name|mtype|level|year|major">
      <it>
       <v0>1</v0>
       <v1>云南财经大学</v1>
       <v2></v2>
       <v3>专升本</v3>
       <v4>3年</v4>
       <v5>工商管理</v5>
      </it>
      <it>
       <v0>2</v0>
       <v1>云南财经大学</v1>
       <v2></v2>
       <v3>专升本</v3>
       <v4>3年</v4>
       <v5>会计学</v5>
      </it>
      <it>
       <v0>3</v0>
       <v1>云南财经大学</v1>
       <v2></v2>
       <v3>专升本</v3>
       <v4>3年</v4>
       <v5>金融学</v5>
      </it>
      <it>
       <v0>4</v0>
       <v1>云南财经大学</v1>
       <v2></v2>
       <v3>高升专</v3>
       <v4>3年</v4>
       <v5>法律事务</v5>
      </it>
     </menu>
    </root>
    

      

    使用方法介绍:

    var dbObj=new xml_db("db.xml",false);
    var data=dbObj.select("menu","id,name,major","where `major`!='金融学'","limit 0,2","order by `id` desc");
    for(var i=0;i< data.length;i++){
     document.write(i+"->id:"+data[i]['id']+" name:"+data[i]['name']+" major:"+data[i]['major']+"<br/>");
    }

    输出:
    0->id:1 name:云南财经大学 major:工商管理
    1->id:2 name:云南财经大学 major:会计学 
    其它方法说明:
    tables():返回所有表的数组;
    fields(tb):返回表名为tb的所有字段名;
    count(tb,where):返回表tb中符合where条件的记录数量

  • 相关阅读:
    获取时间差
    列表添加空字符串
    python提示InsecureRequestWarning
    网络抓包工具
    活动目录相关的面试题(一)
    How to Install Zabbix 4 on CentOS 8 / RHEL 8 in 10 minutes!
    服务器在使用 yum 命令时出现 No match for argument: screen Error: Unable to find a match 错误
    RHEL8/CentOS8的基础防火墙配置-用例
    RHEL8和CentOS8怎么重启网络
    信息安全等级保护等级划分
  • 原文地址:https://www.cnblogs.com/springwind2006/p/5872333.html
Copyright © 2011-2022 走看看