php操作xml類讀取查詢刪除數據(支持三級節點)

php操作xml類主要是針對xml文件夾一個讀取查詢刪除數據例子,下面一起來看看,目前此類暫只支持三級節點哦。

文件名:xml.class.php

代碼如下
/***
* *
* 文件名: xml.php *
* 作 用: xml類,完善中,暫只支持三級節點 *
* 作 者: loking(biyees) *
* *
* example 讀取數據: *
* $xml = new xml(“dbase.xml”,’table’); *
* $data=$xml->xml_fetch_array(); *
* echo ”<pre style=\”;\”>”; *
* 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=”document”;
$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=\”;\text-align:left\”>”;
//print_r($true);
$true=0;//符合條件數歸零,進入下一輪循環
}
} else {
$result=$this- >array;
}
//echo ”<pre style=\”;\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=\”;\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=\”;\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=\”gb2312\”?>\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>”;
dbase,”w’>[email protected]($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”);
}
dbase,”w’>[email protected]($this->dbase,”w”);
rewind($fp);
flock($fp, LOCK_EX);
fputs($fp, ”<?xml version=\”1.0\” encoding=\”gb2312\”?>\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);
}
}
?>

使用方法:

插入一條記錄

代碼如下

require_once(‘xml.class.php’);

$xml = new xml(“exemple.xml”,”item”);

$newarray = array(

“title”=>”XML標題“,

“text”=>”PHP的XML類測試!“

);

$insert=$xml->xml_query(‘insert’,”,”,$newarray);//第二及第三個變量位置是條件,留空表示在最後插入

修改記錄

require_once(‘xml.class.php’);

$xml = new xml(“exemple.xml”,”item”);

$array = array(

“title”=>”XML標題“,

“text”=>”PHP的XML類測試!“

);

$insert=$xml->xml_query(‘update’,'title,=,20年後世界將會怎樣?‘,’and’,$array);//title標簽等于xxx的用$array替換(可以建唯一屬性的標簽,比如id,這樣就可以修改某一條記錄)

刪除記錄

代碼如下

require_once(‘xml.class.php’);

$xml = new xml(“exemple.xml”,”item”);

$array = array();

$insert=$xml->xml_query(‘update’,'title,=,20年後世界將會怎樣?‘,’and’,$array);//數組留空

備注

刪除時其實是把值變空,我們可以修改一下xml_update(),在生成xml文件之前先判斷$array的值,如果值爲空就不寫入到最終的數組中就是刪除的效果了。

寫入xml文件時速度粉快(我測試過30000條記錄的情況),插入時只插入一條記錄,修改速度也相當的快,挺適合中型網站生成XML時使用,所以推薦一下。

更多相關文章
  • 本文章來給各位同學介紹一個PHP tclip擴展調用opencv從記憶體中讀取及解析圖片數據的問題,希望文章能幫助到大家哦.前兩天蠻說有一個PHP擴展,tclip圖片裁剪程序.Tclip致力于人臉識別和圖片顯著性區域的識別,它與其他圖片裁剪程序最大的不同之處在于,在裁剪後的圖片中保留人臉和其他圖片顯 ...
  • 今天看到一個朋友分享兩處隨機讀取N條記錄的文章,下面我們做了一下之後會發現可以隨機做個更新了,下面一起來看看吧.隨機讀取數據MYSQL自身語句便可實現,下面舉例來說明:比如,我要隨機讀取6條數據顯示給浏覽者:MYSQ
  • 下面我來給大家介紹sql隨機查詢的函數,在mysql中我們會使用到rand()函數,在mssql中我們使用到newid()函數,方法都很簡單mysql是這樣實現的: 代碼如下 select * from tablen
  • 文章先來介紹關于qqwry.dat的文件內容結構然後根據它的特點我們可寫出讀取qqwry.dat ip庫的內容找到我們想要的內容.首先看看QQWry.Data文件的內容結構 ,以及解讀方式 .一.文件結構 文件主要分
  • mysql教程_query() 函數執行一條 MySQL 查詢.語法mysql_query(query,connection)參數 描述 query 必需.規定要發送的 SQL 查詢.注釋:查詢字符串不應以分號結束. connection 可選.規定 SQL 連接標識符.如果未規定,則使用上一個打開
  • 本文章來大家介紹一篇關于Java操作Mongodb 保存/讀取java對象到/從mongodb,希望此方法對各位同學會有幫助哦.Mongodb官方提供的Java驅動,保存與讀取,需要的者是DBObject對象,這是一
  • 對于開發人員估計都知道使用PHP Excel類讀取和生成excel文件是非常的簡單的了,下文我就來爲各位介紹幾個例子. 使用PHP來生成Excel的方法有很多,比如使用最簡單的回車符,制表符來生成,或者直接使用html的table格式,但這些方式兼容性都有所欠缺.測試了一下PHPExce類,發現太l ...
  • C# 是使用Winform操作MYSQL 新增,讀取數據亂碼
    1.C# Winform 連接MYSQL 對MySQL進行新增,讀取數據操作,使用Mysql.MySql.Data組件進行數據連接及操作 2.mysql的版本本較低4.01 不能對Mysql的環境進行配置1.C# Winform 連接MYSQL 對MySQL進行新增,讀取數據操作,使用Mysql.M
一周排行