/***
* *
* FileName: xml.php *
* Function: XML class, perfect, only support level three node *
* Author: loking (biyees) *
* *
* Example Read data: *
* $xml = new XML ("Dbase.xml", ' table '); *
* $data = $xml->xml_fetch_array (); *
* echo "<pre style=\" font-size:12px;\ ">"; *
* Print_r ($DATA); *
* *
******************/
Class xml{
var $dbase; database, XML file to read
var $dbname; Database name, top level element, consistent with database file name
var $dbtable; Data table, the node to be obtained
var $parser; Profiler
var $vals; Property
var $index; Index
var $dbtable _array;//node Array
var $array; An array of subordinate nodes
var $result; The result returned
var $querys;
function XML ($dbase, $dbtable) {
$this->dbase= $dbase;
$this->dbname= "document";
$this->dbtable= $dbtable;
$data = $this->readxml ($this->dbase);
if (! $data) {
Die ("Cannot read $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);
Traversing the index, filtering out the node name for the value to be fetched: $dbtable
foreach ($this->index as $key => $val) {
if ($key = = $this->dbtable) {
Get Array of nodes
$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 () returns a sequence of arrays in the array specified by the offset and length parameters.
Fetched node sub array
$value =array_slice ($this->vals, $offset, $len);
Gets a valid array and merges it into an array of results
$this->array[]= $this->parseeff ($value);
}
return true;
}
Reads an XML file into and returns a string
function ReadXml ($file)
{
Return file_get_contents ($file);
}
Get a valid array
function Parseeff ($effective) {
For ($i =0 $i < count ($effective); $i + +) {
$effect [$effective [$i] ["tag"]] = $effective [$i] ["value"];
}
return $effect;
}
Xml_query (methods, conditions, multiple conditions, logical operators and or OR, total data array, inserted or updated array)
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);
}
}
Get an XML array
function Xml_fetch_array ($condition, $if)
{
$this->querys++;
$row = $this->array; Initializing an array of data
if ($condition) {
Whether there are conditions, if any, to generate an array that matches the criteria
Generates an array of conditions, conditional formatting Field,operator,match
$condition =explode (",", $condition);//condition array
$cs =count ($condition)/3; Number of conditions
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]; Current condition
$field = $condition [' field ']; Field
$operator = $condition ["operator"];//operator
$match = $condition [' Match ']; The
if ($operator = =) && ($row [$r] [$field]== $match)] {
$true ++;//If the conditions are met, the number plus 1
ElseIf ($operator = = '!= ') && ($row [$r] [$field]!= $match]) {
$true ++;//If the conditions are met, the number plus 1
} elseif ($operator = = ' < ') && ($row [$r] [$field]< $match]) {
$true ++;//If the conditions are met, the number plus 1
ElseIf ($operator = = ' <= ') && ($row [$r] [$field]<= $match]) {
$true ++;//If the conditions are met, the number plus 1
} elseif ($operator = = ' > ') && ($row [$r] [$field]> $match]) {
$true ++;//If the conditions are met, the number plus 1
} elseif ($operator = = ' > ') && ($row [$r] [$field]>= $match]) {
$true ++;//If the conditions are met, the number plus 1
}
}
Value based on criteria
if ($if = = ' and ') {
If multiple conditions are and, when the number equals the number of conditions, the array is generated
if ($true = = $cs) {
$result []= $row [$r];
}
} else {
If multiple conditions are or, when there is a record, an array is generated
if ($true!=0) {
$result []= $row [$r];
}
}
Echo $true;
echo "<pre style=\" font-size:12px;\text-align:left\ ">";
Print_r ($true);
$true =0;//meets the condition number to zero, enters the next round cycle
}
} else {
$result = $this->array;
}
echo "<pre style=\" font-size:12px;\text-align:left\ ">";
Print_r ($this->result);
return $result;
}
Filtering or statistics
function Xml_select ($method, $condition, $if)
{
$result = $this->xml_fetch_array ($condition, $if);
if ($method = = ' select ') {
return $result;
} else {
return count ($result);
}
}
Inserting data
function Xml_insert ($condition, $if, $array)
{
$data = $this->xml_fetch_array ($condition, $if);//Total data array
$data []= $array; The inserted total data array
$this->array= $data; Update Total Group
$this->writexml ($data);
}
Get the updated XML and overwrite
function Xml_update ($condition, $if, $array) {
$datas = $this->array; Total Data Array
$subtract = $this->xml_fetch_array ($condition, $if);//the array to update
echo "<pre style=\" font-size:12px;\text-align:left\ ">";
Print_r ($data);
Print_r ($datas);
echo "Every record has". Count ($datas [0]). " Value <br> ";
for ($i =0; $i <count ($datas); $i + +) {
$data = $datas [$i];
echo "The first in the original". $i. " Article <br> ";
foreach ($data as $k = > $v) {
echo "-$i." ". $k." Value is ". $v." <br> ";
echo "– Array to find". $k. " The value is ". $subtract [0][$k]." <br> ";
if ($v = = $subtract [0][$k]) {
$is + +;
}
}
if ($is ==count ($data)) {
echo "--with the $i." In line with <br> ";
$datas [$i]= $array;
Array_splice ($datas, $i, $i + 1);
}
echo "The first in the original". $i. " With the ". $is to find. Matching <br> ";
echo "The first in the original". $i. " The end of the article <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);
}
Write to XML file (write all)
function WriteXml ($array)
{
if (!is_writeable ($this->dbase)) {
Die ("Cannot write". $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 ' > $fp = @fopen ($this->dbase," w ");
Flock ($FP, LOCK_EX);
Rewind ($FP);
Fputs ($fp, $xml);
Fclose ($FP);
}
Write XML-by-line (I try to write 10000 lines, I feel like I didn't write fast, so it doesn't work this way)
function WriteLine ($array)
{
if (!is_writeable ($this->dbase)) {
Die ("Cannot write". $this->dbname. ". XML ");
}
dBASE, "W ' > $fp = @fopen ($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);
}
}
?>
|