加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml?解析类(php版)

发布时间:2020-12-16 07:54:19 所属栏目:百科 来源:网络整理
导读:xml 解析类 ?php ob_start(); /*? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? * Copyright (c) 2003 NightKids??weidewang@magus-soft.com? ?? ?? ?? ?? ?? ?? ? * All rights reserved.? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
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,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 分析类.上面是实用的例子,返回结果是一个二维数组 格式 $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>
? ?? ???<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);//设置需要分析的标记
? ?$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();
?>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读