新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → [原创]用xml模仿mysql的类 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 12201 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: [原创]用xml模仿mysql的类 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     loking 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:98
      门派:XML.ORG.CN
      注册:2006/8/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给loking发送一个短消息 把loking加入好友 查看loking的个人资料 搜索loking在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看loking的博客楼主
    发贴心情 [原创]用xml模仿mysql的类

    <?php
    /******************************************************************************************
    *                                                                                         *
    * 文件名: xml.php                                                                        *
    * 作  用: xml类,完善中,暂只支持三级节点                                                  *
    *                                                                                         *
    * 作  者: loking(biyees)                                                                 *
    * Email:  biyees@gmail.com  QQ:4967530                                                   *
    *                                                                                         *
    * example 读取数据:                                                                      *
    * $xml = new xml("dbase.xml",'table');                                                    *
    * $data=$xml->xml_fetch_array();                                                          *
    * echo "<pre style=\"font-size:12px;\">";                                                 *
    * print_r($data);                                                                         *
    *                                                                                         *
    ******************************************************************************************/
    class xml
    {
     var $dbase;       //数据库,要读取的XML文件
     var $dbname;      //数据库名称,顶层元素,与数据库文件名称一致
     var $dbtable;     //数据表,要取得的节点
     var $parser;      //剖析器 
     var $vals;        //属性
     var $index;       //索引
     var $dbtable_array;//节点数组
     var $array;        //下级节点的数组
     var $result;       //返回的结果
     var $querys;      

     function xml($dbase,$dbtable)
     {
      $this->dbase=$dbase;
      $this->dbname=substr($dbase,strrpos($dbase,"/")+1,-4);
      $this->dbtable=$dbtable;
      $data=$this->ReadXml($this->dbase);
      if(!$data){
       die("无法读取 $this->dbname.xml");
      }
            $this->parser = xml_parser_create();
            xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
      xml_parser_set_option($this->parser,XML_OPTION_SKIP_WHITE,1);
            xml_parse_into_struct($this->parser,$data,$this->vals,$this->index);  
      xml_parser_free($this->parser);
      //遍历索引,筛选出要取值的节点 节点名:$dbtable
      foreach ($this->index as $key=>$val) {
       if ($key == $this->dbtable) {
        //取得节点数组
        $this->dbtable_array = $val; 
       } else {
        continue;
       }
      }
      for ($i=0; $i < count($this->dbtable_array); $i+=2) {
       $offset = $this->dbtable_array[$i] + 1;     
       $len    = $this->dbtable_array[$i + 1] - $offset;
       //array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。
       //所取节点下级数组
       $value=array_slice($this->vals,$offset,$len);
       //取得有效数组,合并为结果数组
       $this->array[]=$this->parseEFF($value);
      }
      return true;
     }
     //将XML文件读入并返回字符串
     function ReadXml($file)
     {
      return file_get_contents($file);
     }    
     //取得有效数组
     function parseEFF($effective) {
      for ($i=0; $i < count($effective); $i++){
       $effect[$effective[$i]["tag"]] = $effective[$i]["value"];
      }
      return $effect;
     }
     //xml_query(方法,条件,多条件时逻辑运算符and or or,总数据数组,插入或更新的数组)
     function xml_query($method,$condition,$if='and',$array=array())
     {
      if(($method=='select')||($method=='count')){
       return $this->xml_select($method,$condition,$if);
      } elseif($method=='insert') {
       return $this->xml_insert($condition,$if,$array);
      } elseif($method=='update') {
       return $this->xml_update($condition,$if,$array);
      }
     }
     //取得xml数组
        function xml_fetch_array($condition,$if)
        {
      //$this->querys++;
      $row = $this->array; //初始化数据数组
      if($condition) {
       //是否有条件,如有条件则生成符合条件的数组
       //生成条件数组,条件格式 field,operator,match
       $condition=explode(",",$condition);//条件数组
       $cs=count($condition)/3;           //条件数
       for($i=0;$i<$cs;$i++){
        $conditions[]=array("field"=>$condition[$i*3],"operator"=>$condition[$i*3+1],"match"=>$condition[$i*3+2]);
       }
       //echo count($row);
       for($r=0;$r<count($row);$r++){
        for($c=0;$c<$cs;$c++){
         //$i++;
         $condition=$conditions[$c];   //当前条件
         $field=$condition['field'];      //字段
         $operator=$condition["operator"];//运算符
         $match=$condition['match'];      //匹配   
         if(($operator=='=')&&($row[$r][$field]==$match)){
          $true++;//若条件符合,符合数加1 
         } elseif(($operator=='!=')&&($row[$r][$field]!=$match)){
          $true++;//若条件符合,符合数加1
         } elseif(($operator=='<')&&($row[$r][$field]<$match)){
          $true++;//若条件符合,符合数加1
         } elseif(($operator=='<=')&&($row[$r][$field]<=$match)){
          $true++;//若条件符合,符合数加1
         } elseif(($operator=='>')&&($row[$r][$field]>$match)){
          $true++;//若条件符合,符合数加1
         } elseif(($operator=='>')&&($row[$r][$field]>=$match)){
          $true++;//若条件符合,符合数加1
         }     
        }    
        //根据条件取值
        if($if=='and'){
         //如果多条件为and,当符合数等于条件数时,生成数组
         if($true==$cs){
          $result[]=$row[$r];
         }
        } else {
         //如果多条件为or,当有符合纪录时,生成数组
         if($true!=0){
          $result[]=$row[$r];
         }
        }
        //echo $true;
        //echo "<pre style=\"font-size:12px;\text-align:left\">";
        //print_r($true);
        $true=0;//符合条件数归零,进入下一轮循环
       }
      } else {
       $result=$this->array;
      } 
      //echo "<pre style=\"font-size:12px;\text-align:left\">";
      //print_r($this->result);
      return $result;
        }
     //筛选或统计
     function xml_select($method,$condition,$if)
     {
      $result=$this->xml_fetch_array($condition,$if);
      if($method=='select'){
       return $result;
      } else {
       return count($result);
      }
      
     }
     //插入数据
     function xml_insert($condition,$if,$array)
     {
      $data=$this->xml_fetch_array($condition,$if);//总数据数组
      $data[]=$array;                              //插入后的总数据数组
      $this->array=$data;                          //更新总数组
      $this->WriteXml($data);
     }

        //得到更新的XML并改写
     function xml_update($condition,$if,$array)
     {
      $datas=$this->array;                              //总数据数组
      $subtract=$this->xml_fetch_array($condition,$if);//要更新的数组
      //echo "<pre style=\"font-size:12px;\text-align:left\">";
      //print_r($data);
      //print_r($datas);
      //echo "每条记录中有".count($datas[0])."个值<br>";
      for($i=0;$i<count($datas);$i++){
       $data=$datas[$i];
       //echo "原始记录中的第".$i."条<br>";
       foreach($data as $k=>$v){
        //echo "-第".$i."条的".$k."值为".$v."<br>";
        //echo "--要查找的数组".$k."值为".$subtract[0][$k]."<br>";
        if($v==$subtract[0][$k]){
         $is++;
        }   
       }
       if($is==count($data)){
        //echo "----与第".$i."条符合<br>";
        $datas[$i]=$array;
        //array_splice($datas,$i,$i+1);
       }
       //echo "原始记录中的第".$i."条与要查找的有".$is."匹配<br>";    
       //echo "原始记录中的第".$i."条结束<br>";
       $is=0;
      }
      //array_splice($datas,2,2+1,$array);
      //echo "<pre style=\"font-size:12px;\text-align:left\">";
      //print_r($datas);
      $this->array=$datas;
      $this->WriteXml($datas);
      
     }
     //写入XML文件(全部写入)
     function WriteXml($array)
     {
      if(!is_writeable($this->dbase)){
       die("无法写入".$this->dbname.".xml");
      }
      $xml.="<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
      $xml.="<$this->dbname>\r\n";
      for($i=0;$i<count($array);$i++){
       $xml.="<$this->dbtable>\r\n";
       foreach($array[$i] as $k=>$s){
        $xml.="<$k>$s</$k>\r\n";
       }
       $xml.="</$this->dbtable>\r\n";
      }
      $xml.="</$this->dbname>";
      $fp=@fopen($this->dbase,"w");
      flock($fp, LOCK_EX);
      rewind($fp);  
      fputs($fp,$xml);
      fclose($fp);
     }
     //逐行写入xml(我试着写入10000行,感觉没一次写入快,所以没用这种写入方式)
     function WriteLine($array)
     {
      if(!is_writeable($this->dbase)){
       die("无法写入".$this->dbname.".xml");
      }
      $fp=@fopen($this->dbase,"w");
      rewind($fp);
      flock($fp, LOCK_EX);
      fputs($fp,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
      fputs($fp,"<$this->dbname>\r\n");
      for($i=0;$i<count($array);$i++){
       fputs($fp,"<$this->dbtable>\r\n");
       $xml.="<$this->dbtable>\r\n";
       foreach($array[$i] as $k=>$s){
        fputs($fp,"<$k>$s</$k>\r\n");
       }
       fputs($fp,"</$this->dbtable>\r\n");
      }
      fputs($fp,"</$this->dbname>");
      fclose($fp);
     }
    }
    ?>


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/12 14:21:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/19 18:16:00

    本主题贴数4,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  [原创]用xml模仿mysql的类(8538字) - loking,2006年8月12日
        回复:  WELL DONE!!!![em16][em41][em41](35字) - DamYankee,2006年8月30日
        回复:  做沙发不错!(14字) - wang_x_ke,2006年8月25日
        回复:  简单说明$xml=new xml('data.xml');$array=$xml->xml_q..(459字) - loking,2006年8月12日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    125.000ms