xml 解析类 ?php
ob_start();
/*
* Copyright (c) 2003 NightKidsweidewang@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-2410:41:11
XML 分析类.上面是实用的例子,返回结果是一个二维数组 格式 $Result[x][xml标记]=xml标记值;
这里没有从 http 中取数据,要用另外一个类取数据.
*/
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 "不能创建 XML 解析器.br /";
return false;
}
}#Function 分析XML End.
/*
function SetNeedParse($NeedParse){
$this-NeedParseArray=$NeedParse;
}*/
function SetNeedParseBlock($NeedParseBlock){
$this-NeedParseBlockArray=$NeedParseBlock;
}
function SetXMLData($XMLData=NULL){//设置XML数据
if($XMLData==""){ if($this-debug) echo "XML 数据为空.br /";exit();
return false;
}
$this-XMLData=$XMLData;
}#Function SetXMLData End.
function GetXMLData(){
if($this-XMLData==""){ if($this-debug) echo "还没有设置 XML 数据.br /";exit();
return false;
}
return $this-XMLData;
}#Function getXMLData End.
function ParseXMLData(){
if($this-debug !$this-ParseHandle) echo "不能创建 XML 解析器.br /";
//if(!is_array($this-NeedParseArray) $this-debug) echo "请设置要分析的标记.br /";
$XMLData = $this-GetXMLData();
$this-XMLData = preg_replace('/?xml(.*)??'.'/', '', $XMLData);
if( trim($this-XMLData)=="" ){ if($this-debug) echo "XML 数据错误.br /";
return false;
}
xml_parser_set_option($this-ParseHandle, XML_OPTION_CASE_FOLDING, false);
xml_parser_set_option($this-ParseHandle, XML_OPTION_TARGET_ENCODING, $this-CharSet);
xml_set_object($this-ParseHandle, $this);
xml_set_element_handler($this-ParseHandle, 'StartTag', 'EndTag');
xml_set_character_data_handler($this-ParseHandle, 'CData');
if (!xml_parse($this-ParseHandle, $this-XMLData)) {
if($this-debug)
die(sprintf('XML error: %s at line %d',
xml_error_string(xml_get_error_code($this-ParseHandle)),
xml_get_current_line_number($this-ParseHandle)));
return false;
}
}#Function 解析XML数据 End.
function StartTag($ParseHandle,$Tag,$Attrib){#解析器句柄,标记名称,标记属性(数组)
$this-OpenTag[$Tag];
}#Function 起始标记 End.
function CData($ParseHandle=NULL,$DataString=NULL){
$this-TmpData=$DataString;
}#Function 取数据 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 结束标记 End.
function Result(){
$aTmp=$this-ReturnData;
return $aTmp;
}
#----------------------
}#Class 分析XML End.
#===========================
# 使用实例
#
#===========================
/*
$XMLData= EOD
U-MAX
ValidError
ValidErrorCodeErrorCode/ValidErrorCode
ValidErrorInfoThe 'ProductCode' element has an invalid value according to its data type. An error occurred at(35, 29)./ValidErrorInfo
ErrMSGEraer23 asdf SGs/ErrMSG
/ValidError
ValidError
ValidErrorCodeErrorCode1/ValidErrorCode
ValidErrorInfo111The 'ProductCode' element has an invalid value according to its data type. An error occurred at(35, 29)./ValidErrorInfo
ErrMSGErrf aeaa SGs/ErrMSG
/ValidError
ValidError
ValidErrorCodeErrorCo234/ValidErrorCode
ValidErrorInfo111The 'ProductCode' element has an invalid value according to its data type. An error occurred at(35, 29)./ValidErrorInfo
ErrMSGErrfae asdfSGs/ErrMSG
/ValidError
ValidError
ValidErrorCodeErasdfasode1/ValidErrorCode
ValidErrorInfo11fasd asdas a sd29)./ValidErrorInfo
ErrMSGEafe3aeaSGs/ErrMSG
/ValidError
/U-MAX
EOD;
#===========================
//$NeedParse=array("ValidErrorCode","ValidErrorInfo");
$NeedParseBlock=array("ValidError","Fuck");
$xx = new z99ParseXML();
$xx-debug=true;
//$xx-SetNeedParse($NeedParse);//设置需要分析的标记
$xx-SetNeedParseBlock($NeedParseBlock);//设置需要分析的标记块 比如上面的块是 ValidError
$xx-SetXMLData($XMLData);
$xx-GetXMLData();
$xx-ParseXMLData(); //如果 === false 说明分析数据时发生错误
$aa=$xx-Result();
echo $aa[0][ValidErrorCode]."br";
echo $aa[0][ErrMSG]."br";
echo $aa[0][ValidErrorInfo]."br";
echo "br";
echo $aa[1][ValidErrorCode]."br";
echo $aa[1][ErrMSG]."br";
echo $aa[1][ValidErrorInfo]."br";
for($i=0;$i=count($aa)-1;$i++){
//echo $aa[$i][ValidErrorCode];
//echo $aa[$i][ValidErrorInfo]."br";
}
#===========================
*/
ob_end_flush();
?