xml 解析類
?php ob_start(); /* * Copyright (c) 2003 NightKids weidewang@magus-soft.com> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ ################################ /* Last modify 2003-10-24 10:41:11 XML 分析類.上面是實用的例子,返回結(jié)果是一個二維數(shù)組 格式 $Result[x][xml標記]=xml標記值; 這里沒有從 http 中取數(shù)據(jù),要用另外一個類取數(shù)據(jù). */ class z99ParseXML{ #---------------------- var $ParseHandle=NULL; //解析器指針 var $CharSet="utf-8";//編碼方式 var $Tag=NULL; var $Attrib=array(); var $DataString=NULL; var $XMLData=NULL;
var $debug = false;
var $ReturnData=array();
var $CurrentTag=NULL; var $OpenTag=array(); var $CloseTag=array();
//var $NeedParseArray=array(); var $NeedParseBlockArray=array(); var $TagSum=0;
var $CurrentTagA=NULL;
var $TmpData=NULL; #---------------------- function z99ParseXML(){ $this->ParseHandle = xml_parser_create($this->CharSet); if(!$this->ParseHandle){ echo "不能創(chuàng)建 XML 解析器.br />"; return false; } }#Function 分析XML End. /* function SetNeedParse($NeedParse){ $this->NeedParseArray=$NeedParse; }*/ function SetNeedParseBlock($NeedParseBlock){ $this->NeedParseBlockArray=$NeedParseBlock; } function SetXMLData($XMLData=NULL){//設(shè)置XML數(shù)據(jù) if($XMLData==""){ if($this->debug) echo "XML 數(shù)據(jù)為空.br />";exit(); return false; } $this->XMLData=$XMLData; }#Function SetXMLData End.
function GetXMLData(){ if($this->XMLData==""){ if($this->debug) echo "還沒有設(shè)置 XML 數(shù)據(jù).br />";exit(); return false; } return $this->XMLData; }#Function getXMLData End.
function StartTag($ParseHandle,$Tag,$Attrib){#解析器句柄,標記名稱,標記屬性(數(shù)組) $this->OpenTag[$Tag]; }#Function 起始標記 End.
function CData($ParseHandle=NULL,$DataString=NULL){ $this->TmpData=$DataString; }#Function 取數(shù)據(jù) End.
function EndTag($ParseHandle,$Tag){ $NeedParse=$this->NeedParseBlockArray; $this->CloseTag[$Tag]; $this->CurrentTag=$Tag; $TmpData=$this->TmpData; $DataLen=strlen(trim($TmpData)); if( $DataLen !=0 ){ $this->ReturnData[$this->TagSum][$Tag]=$TmpData; } if(array_search($Tag,$NeedParse)!==false) $this->TagSum++; }#Function 結(jié)束標記 End. function Result(){ $aTmp=$this->ReturnData; return $aTmp; } #---------------------- }#Class 分析XML End. #=========================== # 使用實例 # #=========================== /* $XMLData= EOD U-MAX> ValidError> ValidErrorCode>ErrorCode/ValidErrorCode> ValidErrorInfo>The 'ProductCode' element has an invalid value according to its data type. An error occurred at(35, 29)./ValidErrorInfo> ErrMSG>Eraer23 asdf SGs/ErrMSG> /ValidError> ValidError> ValidErrorCode>ErrorCode1/ValidErrorCode> ValidErrorInfo>111The 'ProductCode' element has an invalid value according to its data type. An error occurred at(35, 29)./ValidErrorInfo> ErrMSG>Errf aeaa SGs/ErrMSG> /ValidError> ValidError> ValidErrorCode>ErrorCo234/ValidErrorCode> ValidErrorInfo>111The 'ProductCode' element has an invalid value according to its data type. An error occurred at(35, 29)./ValidErrorInfo> ErrMSG>Errfae asdfSGs/ErrMSG> /ValidError> ValidError> ValidErrorCode>Erasdfasode1/ValidErrorCode> ValidErrorInfo>11fasd asdas a sd29)./ValidErrorInfo> ErrMSG>Eafe3aeaSGs/ErrMSG> /ValidError> /U-MAX> EOD; #=========================== //$NeedParse=array("ValidErrorCode","ValidErrorInfo"); $NeedParseBlock=array("ValidError","Fuck"); $xx = new z99ParseXML(); $xx->debug=true; //$xx->SetNeedParse($NeedParse);//設(shè)置需要分析的標記 $xx->SetNeedParseBlock($NeedParseBlock);//設(shè)置需要分析的標記塊 比如上面的塊是 ValidError $xx->SetXMLData($XMLData); $xx->GetXMLData(); $xx->ParseXMLData(); //如果 === false 說明分析數(shù)據(jù)時發(fā)生錯誤