当前位置:首页 > PHP教程 > php高级应用 > 列表

php操作xml类读取查询删除数据(支持三级节点)

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-08 10:04:43 浏览: 评论:0 

php操作xml类主要是针对xml文件夹一个读取查询删除数据例子,下面一起来看看,目前此类暂只支持三级节点哦.

文件名,xml.class.php,代码如下:

  1. <?php 
  2. /***  
  3. * * 
  4. * 文件名: xml.php * 
  5. * 作 用: xml类,完善中,暂只支持三级节点 * 
  6. * 作 者: loking(biyees) * 
  7. * * 
  8. * example 读取数据: *  
  9. * $xml = new xml(“dbase.xml”,’table’); *  
  10. * $data=$xml->xml_fetch_array(); * 
  11. * echo ”<pre style=\”font-size:12px;\”>”; * 
  12. * print_r($data); *  
  13. * * 
  14. ******************/ 
  15. class xml{ 
  16. var $dbase//数据库,要读取的XML文件  
  17. var $dbname//数据库名称,顶层元素,与数据库文件名称一致  
  18. var $dbtable//数据表,要取得的节点  
  19. var $parser//剖析器  
  20. var $vals//属性  
  21. var $index//索引  
  22. var $dbtable_array;//节点数组  
  23. var $array//下级节点的数组  
  24. var $result//返回的结果  
  25. var $querys
  26.  
  27. function xml($dbase,$dbtable){ 
  28. $this->dbase=$dbase
  29. $this- >dbname=”document”; 
  30. $this- >dbtable=$dbtable
  31. $data=$this- >ReadXml($this->dbase); 
  32. if(!$data){  
  33. die( ”无法读取 $this->dbname.xml”); 
  34. }  
  35. $this- >parser = xml_parser_create(); 
  36. xml_parser_set_option($this- >parser,XML_OPTION_CASE_FOLDING,0); 
  37. xml_parser_set_option($this- >parser,XML_OPTION_SKIP_WHITE,1); 
  38. xml_parse_into_struct($this- >parser,$data,$this->vals,$this->index);  
  39. xml_parser_free($this- >parser); 
  40. //遍历索引,筛选出要取值的节点 节点名:$dbtable  
  41. foreach ($this- >index as $key=>$val) { 
  42. if ($key == $this- >dbtable) { 
  43. //取得节点数组  
  44. $this- >dbtable_array = $val;  
  45. else {  
  46. continue;  
  47. }  
  48. }  
  49. for ($i=0; $i < count($this->dbtable_array); $i+=2) { 
  50. $offset = $this- >dbtable_array[$i] + 1;  
  51. $len = $this- >dbtable_array[$i + 1] - $offset
  52. //array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。  
  53. //所取节点下级数组  
  54. $value=array_slice($this- >vals,$offset,$len); 
  55. //取得有效数组,合并为结果数组  
  56. $this- >array[]=$this->parseEFF($value); 
  57. }  
  58. return true;  
  59. }  
  60. //将XML文件读入并返回字符串  
  61. function ReadXml($file)  
  62. {  
  63. return file_get_contents($file);  
  64. }  
  65. //取得有效数组  
  66. function parseEFF($effective) {  
  67. for ($i=0; $i < count($effective); $i++){ 
  68. $effect[$effective[$i][ "tag"]] = $effective[$i]["value"]; 
  69. }  //开源软件:phpfensi.com 
  70. return $effect;  
  71. }  
  72. //xml_query(方法,条件,多条件时逻辑运算符and or or,总数据数组,插入或更新的数组)  
  73. function xml_query($method,$condition,$if=’and’,$array=array())  
  74. {  
  75. if(($method==’select’)||($method==’count’)){  
  76. return $this- >xml_select($method,$condition,$if); 
  77. elseif($method==’insert’) {  
  78. return $this- >xml_insert($condition,$if,$array); 
  79. elseif($method==’update’) {  
  80. return $this- >xml_update($condition,$if,$array); 
  81. }  
  82. }  
  83. //取得xml数组  
  84. function xml_fetch_array($condition,$if)  
  85. {  
  86. //$this- >querys++; 
  87. $row = $this- >array//初始化数据数组 
  88. if($condition) {  
  89. //是否有条件,如有条件则生成符合条件的数组  
  90. //生成条件数组,条件格式 field,operator,match  
  91. $condition=explode( ”,”,$condition);//条件数组 
  92. $cs=count($condition)/3; //条件数  
  93. for($i=0;$i <$cs;$i++){ 
  94. $conditions[]=array( ”field”=>$condition[$i*3],”operator”=>$condition[$i*3+1],”match”=>$condition[$i*3+2]); 
  95. }  
  96. //echo count($row);  
  97. for($r=0;$r <count($row);$r++){ 
  98. for($c=0;$c <$cs;$c++){ 
  99. //$i++;  
  100. $condition=$conditions[$c]; //当前条件  
  101. $field=$condition['field']; //字段  
  102. $operator=$condition"operator"];//运算符 
  103. $match=$condition['match']; //匹配  
  104. if(($operator==’=') &&($row[$r][$field]==$match)){ 
  105. $true++;//若条件符合,符合数加1  
  106. elseif(($operator==’!=’) &&($row[$r][$field]!=$match)){ 
  107. $true++;//若条件符合,符合数加1  
  108. elseif(($operator==’ <’)&&($row[$r][$field]<$match)){ 
  109. $true++;//若条件符合,符合数加1  
  110. elseif(($operator==’ <=’)&&($row[$r][$field]<=$match)){ 
  111. $true++;//若条件符合,符合数加1  
  112. elseif(($operator==’ >’)&&($row[$r][$field]>$match)){ 
  113. $true++;//若条件符合,符合数加1  
  114. elseif(($operator==’ >’)&&($row[$r][$field]>=$match)){ 
  115. $true++;//若条件符合,符合数加1  
  116. }  
  117. }  
  118. //根据条件取值  
  119. if($if==’and’){  
  120. //如果多条件为and,当符合数等于条件数时,生成数组  
  121. if($true==$cs){  
  122. $result[]=$row[$r];  
  123. }  
  124. else {  
  125. //如果多条件为or,当有符合纪录时,生成数组  
  126. if($true!=0){  
  127. $result[]=$row[$r];  
  128. }  
  129. }  
  130. //echo $true;  
  131. //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; 
  132. //print_r($true);  
  133. $true=0;//符合条件数归零,进入下一轮循环  
  134. }  
  135. else {  
  136. $result=$this- >array
  137. }  
  138. //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; 
  139. //print_r($this- >result); 
  140. return $result;  
  141. }  
  142. //筛选或统计  
  143. function xml_select($method,$condition,$if)  
  144. {  
  145. $result=$this- >xml_fetch_array($condition,$if); 
  146. if($method==’select’){  
  147. return $result;  
  148. else {  
  149. return count($result);  
  150. }  
  151. //插入数据  
  152. function xml_insert($condition,$if,$array)  
  153. {  
  154. $data=$this- >xml_fetch_array($condition,$if);//总数据数组 
  155. $data[]=$array//插入后的总数据数组  
  156. $this- >array=$data//更新总数组 
  157. $this- >WriteXml($data); 
  158. }  
  159. //得到更新的XML并改写  
  160. function xml_update($condition,$if,$array){  
  161. $datas=$this- >array//总数据数组 
  162. $subtract=$this- >xml_fetch_array($condition,$if);//要更新的数组 
  163. //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; 
  164. //print_r($data);  
  165. //print_r($datas);  
  166. //echo ”每条记录中有“.count($datas[0]).”个值<br>”; 
  167. for($i=0;$i <count($datas);$i++){ 
  168. $data=$datas[$i];  
  169. //echo ”原始记录中的第“.$i.”条<br>”; 
  170. foreach($data as $k= >$v){ 
  171. //echo ”-第“.$i.”条的“.$k.”值为“.$v.”<br>”; 
  172. //echo ”–要查找的数组“.$k.”值为“.$subtract[0][$k].”<br>”; 
  173. if($v==$subtract[0][$k]){  
  174. $is++;  
  175. }  
  176. }  
  177. if($is==count($data)){  
  178. //echo ”—-与第“.$i.”条符合<br>”; 
  179. $datas[$i]=$array;  
  180. //array_splice($datas,$i,$i+1);  
  181. }  
  182. //echo ”原始记录中的第“.$i.”条与要查找的有“.$is.”匹配<br>”;  
  183. //echo ”原始记录中的第“.$i.”条结束<br>”; 
  184. $is=0;  
  185. }  
  186. //array_splice($datas,2,2+1,$array);  
  187. //echo ”<pre style=\”font-size:12px;\text-align:left\”>”; 
  188. //print_r($datas);  
  189. $this- >array=$datas
  190. $this- >WriteXml($datas); 
  191.  
  192. }  
  193. //写入XML文件(全部写入)  
  194. function WriteXml($array)  
  195. {  
  196. if(!is_writeable($this- >dbase)){ 
  197. die( ”无法写入“.$this->dbname.”.xml”); 
  198. }  
  199. $xml.= ”<?xml version=\”1.0\” encoding=\”gb2312\”?>\r\n”; 
  200. $xml.= ”<$this->dbname>\r\n”; 
  201. for($i=0;$i <count($array);$i++){ 
  202. $xml.= ”<$this->dbtable>\r\n”; 
  203. foreach($array[$ias $k= >$s){ 
  204. $xml.= ”<$k>$s</$k>\r\n”; 
  205. }  
  206. $xml.= ”</$this->dbtable>\r\n”; 
  207. }  
  208. $xml.= ”</$this->dbname>”; 
  209. dbase,”w’>$fp=@fopen($this->dbase,”w”); 
  210. flock($fp, LOCK_EX);  
  211. rewind($fp);  
  212. fputs($fp,$xml);  
  213. fclose($fp);  
  214. }  
  215. //逐行写入xml(我试着写入10000行,感觉没一次写入快,所以没用这种写入方式)  
  216. function WriteLine($array)  
  217. {  
  218. if(!is_writeable($this- >dbase)){ 
  219. die( ”无法写入“.$this->dbname.”.xml”); 
  220. }  
  221. dbase,”w’>$fp=@fopen($this->dbase,”w”); 
  222. rewind($fp);  
  223. flock($fp, LOCK_EX);  
  224. fputs($fp, ”<?xml version=\”1.0\” encoding=\”gb2312\”?>\r\n”); 
  225. fputs($fp, ”<$this->dbname>\r\n”); 
  226. for($i=0;$i <count($array);$i++){ 
  227. fputs($fp, ”<$this->dbtable>\r\n”); 
  228. $xml.= ”<$this->dbtable>\r\n”; 
  229. foreach($array[$ias $k= >$s){ 
  230. fputs($fp, ”<$k>$s</$k>\r\n”); 
  231. }  
  232. fputs($fp, ”</$this->dbtable>\r\n”); 
  233. }  
  234. fputs($fp, ”</$this->dbname>”); 
  235. fclose($fp);  
  236. }  
  237. ?> 

使用方法:插入一条记录,代码如下:

  1. require_once(‘xml.class.php’); 
  2. $xml = new xml(“exemple.xml”,”item”); 
  3. $newarray = array
  4. “title”=>”XML标题“, 
  5. “text”=>”PHP的XML类测试!“ 
  6. ); 
  7. $insert=$xml->xml_query(‘insert’,”,”,$newarray);//第二及第三个变量位置是条件,留空表示在最后插入 
  8. 修改记录 
  9. require_once(‘xml.class.php’); 
  10. $xml = new xml(“exemple.xml”,”item”); 
  11. $array = array
  12. “title”=>”XML标题“, 
  13. “text”=>”PHP的XML类测试!“ 
  14. ); 
  15. $insert=$xml->xml_query(‘update’,'title,=,20年后世界将会怎样?‘,’and’,$array);//title标签等于xxx的用$array替换(可以建唯一属性的标签,比如id,这样就可以修改某一条记录) 

删除记录,代码如下:

  1. require_once(‘xml.class.php’); 
  2. $xml = new xml(“exemple.xml”,”item”); 
  3. $array = array(); 
  4. $insert=$xml->xml_query(‘update’,'title,=,20年后世界将会怎样?‘,’and’,$array);//数组留空 

备注:删除时其实是把值变空,我们可以修改一下xml_update(),在生成xml文件之前先判断$array的值,如果值为空就不写入到最终的数组中就是删除的效果了.

写入xml文件时速度粉快(我测试过30000条记录的情况),插入时只插入一条记录,修改速度也相当的快,挺适合中型网站生成XML时使用,所以推荐一下.

Tags: php操作xml php查询删除

分享到: