PHP操作XML做数据库的类
<?php /* * 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); } } ?>
文章网址:http://www.phprm.com/base/b1284c4074732d2bfbd928f3e8b0cbaa.html
随意转载^^但请附上教程地址。