xml.class.php ファイルのコード
コードをコピー コードは次のとおりです:
* 読み取りデータの例:
*
* $xml = new xml("dbase.xml",'table');
*
* $data=$xml->xml_fetch_array();
*
* echo "
";
*
* print_r ( $data);
*
class xml
{
var $dbase; //データベース名、最上位要素、データベースファイルの名前と一致します
var $dbtable; //取得するデータテーブル、ノード
var $vals; //属性
var $index; ; / /Index
var $dbtable_array;//ノード配列
var $result; //返される結果
var $querys; 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,$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 {
続行;
}
}
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() はオフセットで指定された配列を返します。長さのパラメータ。
//取得したノードの下位配列
$value=array_slice($this->vals,$offset,$len);
//有効な配列を取得し、それをマージします。 result array
$this ->array[]=$this->parseEFF($value);
}
return true;
}
//XML ファイルを読み取って返す文字列
function ReadXml($file)
{
return file_get_contents($file);
}
//有効な配列を取得
function parseEFF($Effective) {
for ($i=0 ; $i$effect[$effect[$i]["tag"]] = $effect[$i]["value" ];
}
return $effect;
}
//xml_query(メソッド、条件、複数条件の論理演算子、または挿入または更新された配列)
関数 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) {
//条件の有無、ある場合は条件を満たす配列を生成
//条件配列、条件付き書式フィールド、演算子を生成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;$rfor($c=0;$c<$cs;$c ){
//$i ; //現在条件
$フィールド=$ 条件['フィールド']; //フィールド
$operator=$condition["operator"]; //演算子
$match=$condition['match']; /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 {
//複数の条件がある場合または、一致するレコードがある場合、配列が生成されます。
if($true!=0){
$result[]=$row[$r];
}
}
/ /echo $true;
//echo "
//print_r($true); $true =0;//条件を満たす数値はゼロにリセットされ、次のサイクルに入ります
}
} else {
$result=$this->array;
}
//echo "";
//print_r($this->result);
return $result;
}
//フィルタリングまたは統計
function xml_select($method,$condition,$if)
{
$result=$this->xml_fetch_array($condition,$if) ;
if( $method=='select'){
return $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 "";
//print_r($data);
//print_r($datas);
//echo "各レコードには ".count($datas[0]) の値があります。" br> ;";
for($i=0;$i$data=$datas[$i];
//echo "原文ではRecord 記事 ".$i."
";
foreach($data as $k=>$v){
//echo "-Article ".$i."". $k ."値は ".$v."
";
//echo "--検索される配列".$k."値は".$subtract[0][$k] ] ."
";
if($v==$subtract[0][$k]){
$is ;
}
}
if($is = =count($data)){
//echo "----項目 ".$i."
" と一致します
$datas[$i]=$array; >//array_splice($datas,$i,$i 1);
}
//echo "元のレコードの ".$i." 項目は、検索したい項目と一致します ".$is ." 一致
//echo "元のレコードの ".$i." の終わり
$is=0;
//array_splice($datas,2,2 1,$array);
//echo ""; >//print_r($datas);
$this->array=$datas;
$this->}
//XML ファイルの書き込み ( Write all)
function WriteXml($array)
{
if(!is_writeable($this->dbase)){
die("書き込めません".$this->dbname." .xml");
}
$xml.="rn";
$xml.=" <$ this->dbname>rn";
for($i=0;$i$xml.="<$this->rn; ";
foreach($array[$i] as $k=>$s){
$xml.="<$k>$s$k>rn";
}
$xml.="$this->dbtable>rn";
}
$xml.="$this->dbname>"; =@fopen($this->dbase,"w");
flock($fp, LOCK_EX);
fputs($fp,$xml); >fclose($fp);
}
//xmlを一行ずつ書いていきます(1万行書いてみましたが、速く感じなかったのでこの書き方はしませんでした)
function WriteLine($array)
{
if(!is_writeable($this->dbase)){
die("書き込めません".$this->dbname.".xml ");
}
$fp=@fopen($this->dbase,"w");
rewind($fp);
fputs( $fp,"rn");
fputs($fp,"<$this->dbname>rn" ); 🎜>for($i=0;$ifputs($fp,"<$this->dbtable>rn"); ="<$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);//2 番目と 3 番目の変数の位置は条件であり、空白のままにしておくと、最後に
レコードを変更します
コードをコピー
コードは次のとおりです:
require_once('xml.class.php');
$xml = new xml("exemple.xml","item");$array = array( "title"=>"XML" title", "text"=>"PHP の XML クラス テスト!" ); $insert=$xml->xml_query('update','title,=,世界はどうなるのか20 年後はどうなるでしょうか? ','and',$array);//xxx に等しいタイトル タグを $array に置き換えます (特定のレコードを変更できるように、id などの一意の属性を持つタグを作成できます) )
レコードの削除
コードのコピー
コードは次のとおりです:
require_once(' xml.class.php');
$xml = new xml("exemple.xml","item");$insert=$xml->xml_query ('update','title,=,20 年後の世界 どうなるの? ','and',$array);//配列は空のままにしておきます 削除するときは、値は実際には空になります。xml_update() を変更して XML ファイルを生成する前に、値が空の場合は最終配列に書き込まれません。これは削除の結果です。 XML ファイルの書き込み速度は非常に速く (私は 30,000 レコードをテストしました)、1 つのレコードを挿入するだけで非常に高速に実行できるため、XML を生成する際に使用する中規模の Web サイトに非常に適しています。推奨。