无为清净楼资源网 Design By www.qnjia.com
xml.class.php文件代码
复制代码 代码如下:
<?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"?>rn";
$xml.="<$this->dbname>rn";
for($i=0;$i<count($array);$i++){
$xml.="<$this->dbtable>rn";
foreach($array[$i] as $k=>$s){
$xml.="<$k>$s</$k>rn";
}
$xml.="</$this->dbtable>rn";
}
$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"?>rn");
fputs($fp,"<$this->dbname>rn");
for($i=0;$i<count($array);$i++){
fputs($fp,"<$this->dbtable>rn");
$xml.="<$this->dbtable>rn";
foreach($array[$i] as $k=>$s){
fputs($fp,"<$k>$s</$k>rn");
}
fputs($fp,"</$this->dbtable>rn");
}
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
* 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"?>rn";
$xml.="<$this->dbname>rn";
for($i=0;$i<count($array);$i++){
$xml.="<$this->dbtable>rn";
foreach($array[$i] as $k=>$s){
$xml.="<$k>$s</$k>rn";
}
$xml.="</$this->dbtable>rn";
}
$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"?>rn");
fputs($fp,"<$this->dbname>rn");
for($i=0;$i<count($array);$i++){
fputs($fp,"<$this->dbtable>rn");
$xml.="<$this->dbtable>rn";
foreach($array[$i] as $k=>$s){
fputs($fp,"<$k>$s</$k>rn");
}
fputs($fp,"</$this->dbtable>rn");
}
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时使用,所以推荐一下。
标签:
XML,数据库
无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月14日
2024年11月14日
- faker三冠王是哪几个赛季 faker三冠王赛季介绍
- 岩贵-音乐磁场(AI调音)2CD[WAV]
- 童丽《千愁记旧情》HQII头版限量编号2024[低速原抓WAV+CUE]
- 瑞鸣十五周年纪念3[HQCD限量编号头版][低速原抓WAV+CUE]
- 任天堂专利展示新VR外设:或会随同NS继任机型推出
- 博主制作“Switch 2”模型 与现有掌机对比
- 网友热议IGN为《马路RPG》打5分:要是多元化就能9分了
- 群星《从21世纪安全撤离 电影原声音乐专辑》[320K/MP3][191.19MB]
- 群星《从21世纪安全撤离 电影原声音乐专辑》[FLAC/分轨][592.38MB]
- 群星《奔赴!万人现场 第5期》[320K/MP3][106.99MB]
- 许魏洲.2024-CrossFever交互热爱【智慧大狗】【FLAC分轨】
- BEYOND.1993-FINAL.LIVE.WITH家驹【华纳】【WAV+CUE】
- 梅艳芳.1994-是这样的(金碟版)【华星】【WAV+CUE】
- 张学友《真情流露》HQ+S纯银深度[低速原抓WAV+CUE]
- 江志丰2012-七天[豪记][WAV+CUE]