<?php
/*****************************************
* *
* 文件名: 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 style=\"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 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 );
}
}
?>
<?xml version="1.0" encoding="utf-8"?>
<ata>
<item>
<id>080808045206</id>
<title>XML标题11</title>
<text>PHP的XML类测试!22</text>
</item>
<item>
<id>080808045207</id>
<title>XML标题11</title>
<text>PHP的XML类测试!22</text>
</item>
<item>
<id>1234567</id>
<title>wangwang</title>
<text>wuying</text>
</item>
</ata>
使用方法:
<?php
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时使用,所以推荐一下。
分享到:
相关推荐
本文将详细介绍如何使用PHP操作XML类来实现查询、修改和删除等功能。 首先,我们有一个名为"xml.php"的类文件,这个类可能是对PHP内置的DOMDocument或SimpleXMLElement类进行了封装,以便更方便地进行XML处理。在...
PHP操作XML工具类:包括读取XML,设置XML,创建XML
php写的一个 xml操作类 可以序列化和串行化 支持 array2xml和 xml2array
在提供的“php读取xml文件类”中,很可能是封装了上述操作,以更方便的方式提供XML读取功能。可能包括以下功能: - 初始化类时指定XML文件路径。 - 提供方法来获取XML文档的根节点。 - 提供根据标签名或ID获取节点...
PHP操作xml文件类,生成xml,获取xml内容成数组
DOM允许你构建一个完整的XML文档对象模型,而SAX则是一种基于事件的解析器,它在读取XML文档时逐个处理元素,不会将整个文档加载到内存中。在这个例子中,我们使用的类可能是基于DOM的,因为它是通过数组和属性来...
提供一款php xml读取类,很简单的一个xml分析类了,它可读取指它xml文档,并且输出或取得指定节点的xml数据,本xml类代码是利用了php domdocument来解析xml文档。
综上所述,"PHP读取XML显示到表格"这一技术涵盖了PHP的XML解析、HTML表格生成以及可能涉及的数据处理和样式设计。在阅读了相关博客(如提供的链接)后,开发者可以进一步了解并实践这一过程,提升自己的PHP与XML应用...
XMLReader逐块读取XML,而XMLWriter则用来创建XML文档。 6. **SAX解析**: Simple API for XML (SAX) 是一种事件驱动的解析器,适用于处理大型XML文件。PHP提供了一个SAX解析器接口,但不直接实现,需要第三方库如...
然而,有时我们可能需要将XML数据转化为更易于操作的PHP数组,以便进行进一步的处理。本文将详细介绍如何在PHP中实现XML到数组的转换,并提供相关知识点。 首先,PHP提供了内置的`DOMDocument`类和`DOMXpath`类,...
在IT行业中,XML...通过学习和实践这些PHP操作XML的实例,你可以掌握在PHP环境中处理XML文件的基本技能,从而在Web开发中更有效地交换和处理数据。继续深入研究这些工具和概念,将使你成为更出色的PHP开发者。
XMLReader和XMLWriter则分别用于流式读取和写入XML文档,节省内存。 2. **DOM与SimpleXML** - **DOM**:DOM是W3C标准,通过DOMDocument类实现。可以使用`DOMDocument::loadXML()`加载XML字符串,或`DOMDocument::...
XMLReader是一个向前只读的流解析器,用于逐节读取XML文档,适合处理大型XML文件,因为它不需要一次性加载整个文档到内存。XMLWriter则用于生成XML文档,提供了控制XML结构的细粒度操作。 4. kxparse: 压缩包中的...
总结来说,通过PHP的ZipArchive类,我们能够方便地读取Android APK文件内的XML资源,这对开发者在分析、测试或自动化处理APK时提供了一种有效且独立的解决方案。这种方法不仅简化了流程,也降低了对系统环境的要求,...
本文实例讲述了php实现的xml操作类。分享给大家供大家参考,具体如下: <?php /* 使用方法: $test=new xml(); $test->new_xml('test.xml'); $test->root('document'); $test->append_root_node('book'); $test->...
2. **读取XML数据**: - `getElementsByTagName()` 方法:返回指定标签名的所有元素节点。 - `firstChild` 和 `lastChild` 属性:获取第一个或最后一个子节点。 - `nodeValue` 属性:读取节点的文本内容。 - `...
- **SimpleXML组件**:PHP 5引入的一种简单易用的XML解析工具,特别适合于对XML数据的快速读取和操作。 #### 五、使用SimpleXML组件操作XML - **创建SimpleXML对象** - **函数**: `simplexml_load_string` - **...
下面将详细介绍PHP与XML的交互以及相关的Smarty类库和Zend Framework框架,并简要提及PHP与图像操作的知识点。 1. PHP与XML操作: - DOM(Document Object Model):PHP提供了DOM扩展,可以解析XML文档并创建DOM...
对于XMLReader,你可以逐节点地读取XML,这样可以处理无法一次性加载到内存的大型文件: ```php $reader = new XMLReader(); $reader->open('large.xml'); while ($reader->read()) { if ($reader->nodeType ...
这个转换类的主要目标就是解决这两种数据表示方式之间的转换问题,使得开发者无需深入了解底层的DOM解析或XMLWriter等API,就能方便地进行操作。 1. **XML到PHP的转换**:该类可能包含一个方法,如`xml_to_array()`...