php 操作xml类
2023-09-14 08:59:48 时间
* 文件名: 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 "font-size:12px;\" ";
* print_r($data);
* *
简单说明
$xml=new xml(data.xml);
$array=$xml- xml_query(select,,,);//select方法,取得数组
$result=$xml- xml_query(count,,);//count方法,取得统计数
$insert=$xml- xml_query(insert,,,$newarray);//insert方法,插入新数据(数组)
$update=$xml- xml_query(update,,,$newarray)//update方法,更新数据(数组)
********************************************/
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 "font-size:12px;\text-align:left\" ";
//print_r($true);
$true = 0; //符合条件数归零,进入下一轮循环
}
} else {
$result = $this- array;
}
//echo " pre "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 "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 "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 );
}
require_once(xml.class.php); //xml_query(方法,条件,多条件时逻辑运算符and or or,总数据数组,插入或更新的数组) //查询记录 $xml=new xml("data.xml","item"); $re=$xml- xml_query(select,,); print_r($re); //记录数据数 $xml=new xml("data.xml","item"); $num=$xml- xml_query(count,title,=,XML标题11,); echo $num; //插入一条记录 $xml = new xml("data.xml","item"); $str=date(ymdhis); $newarray = array( "id"= "$str", "title"= "XML标33", "text"= "PHP的XML类测试!444" //第二及第三个变量位置是条件,留空表示在最后插入 $insert=$xml- xml_query(insert,,,$newarray); //修改记录 $xml = new xml("data.xml","item"); $array = array( "id"= "1234567", "title"= "wangwang", "text"= "wuying" //title标签等于xxx的用$array替换(可以建唯一属性的标签,比如id,这样就可以修改某一条记录) $insert=$xml- xml_query(update,id,=,080808045227,and,$array); //删除记录 $xml = new xml("data.xml","item"); $array = array(); $insert=$xml- xml_query(update,id,=,080808045228,and,$array);//数组留空
操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 XPATH 而昨晚在使用 XPATH 的时候, 遇到一个问题, 改了一个晚上才搞定, 差点没吐血.
?php $xml_array=simplexml_load_file( person.xml //将XML中的数据,读取到数组对象中 foreach($xml_array as $tmp) echo $tmp- name. - .
php数组转xml的递归实现 原文:php数组转xml的递归实现 PHP中奖数组转为xml的需求是常见的,而且实现方法也有很多种,百度找了一下各种实现方法,但是基本是借组一些组件啥的。我就自己写了一个字符串拼组的方法,支持多维数组。
require_once(xml.class.php); //xml_query(方法,条件,多条件时逻辑运算符and or or,总数据数组,插入或更新的数组) //查询记录 $xml=new xml("data.xml","item"); $re=$xml- xml_query(select,,); print_r($re); //记录数据数 $xml=new xml("data.xml","item"); $num=$xml- xml_query(count,title,=,XML标题11,); echo $num; //插入一条记录 $xml = new xml("data.xml","item"); $str=date(ymdhis); $newarray = array( "id"= "$str", "title"= "XML标33", "text"= "PHP的XML类测试!444" //第二及第三个变量位置是条件,留空表示在最后插入 $insert=$xml- xml_query(insert,,,$newarray); //修改记录 $xml = new xml("data.xml","item"); $array = array( "id"= "1234567", "title"= "wangwang", "text"= "wuying" //title标签等于xxx的用$array替换(可以建唯一属性的标签,比如id,这样就可以修改某一条记录) $insert=$xml- xml_query(update,id,=,080808045227,and,$array); //删除记录 $xml = new xml("data.xml","item"); $array = array(); $insert=$xml- xml_query(update,id,=,080808045228,and,$array);//数组留空
备注xml文件保存为utf8调用才可以正常
删除时其实是把值变空,我们可以修改一下xml_update(),在生成xml文件之前先判断$array的值,如果值为空就不写入到最终的数组中就是删除的效果了。
写入xml文件时速度粉快(我测试过30000条记录的情况),插入时只插入一条记录,修改速度也相当的快,挺适合中型网站生成XML时使用,所以推荐一下。
操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 XPATH 而昨晚在使用 XPATH 的时候, 遇到一个问题, 改了一个晚上才搞定, 差点没吐血.
?php $xml_array=simplexml_load_file( person.xml //将XML中的数据,读取到数组对象中 foreach($xml_array as $tmp) echo $tmp- name. - .
php数组转xml的递归实现 原文:php数组转xml的递归实现 PHP中奖数组转为xml的需求是常见的,而且实现方法也有很多种,百度找了一下各种实现方法,但是基本是借组一些组件啥的。我就自己写了一个字符串拼组的方法,支持多维数组。
相关文章
- 配置php.ini实现PHP文件上传功能
- PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
- PHP安装模式cgi、fastcgi、php_mod比较
- 【荐】如何正确理解PHP之include,include_once,require,require_once等包含作用域
- PHP 取302跳转后真实 URL 的两种方法
- PHP基于Redis实现轻量级延迟队列
- php:PHP解析xml的4种方法
- PHP将XML转成数组
- [PHP] csv to xml
- 安装php 找不到lib.so包原因分析
- php zip pdf word rar类库
- [php-src] Php扩展开发的琐碎注意点、细节
- 使用PHP生成二维码图像
- Atitit node.js的缺点 优缺点 和php比较 1. 门槛比较 php简单,node麻烦1 1.1. php的优势是语法简单易学,学习曲线平滑度可能居所有语言之首2 1.2. 当用N
- Atitit php pdo的api使用 目录 1.1. PHP PDO简介1 1.2. 若要使用数据库长连接,:PDO::ATTR_PERSISTENT1 2. 其他设置2 2.1. )、P
- Atitit 调用另外语言的功能 目录 1. Waht 常见的语言java python js sql xml h5 c# php等之间的互相调用1 2. 为什么需要互相调用why1 3. 常
- SAP WebIDE 是如何加载SAP UI5里自定义的XML view的 - JerryMaster.view.xml
- PHP 实例 - AJAX 与 XML
- PHP 过滤器
- php反射类 ReflectionClass
- linux下, 再次遇到使用thinkphp的模板标签时,报错used undefined function ThinkTemplatesimplexml_load_string() 是因为没有安装 php-xml包
- win8和win7下解决php5.3和5.4、5.5等不能加载php_curl.dll的终极解决办法 收藏