IT学习者 | 文章大全 | 技术文档 | 桌面壁纸 | 网络电台 | 成语 | 歇后语 | 站长导航 | 下载 | 周公解梦 | 生日密码 | 站长助手 | Flash | IP地址查询
 您现在的位置: IT学习者 >> 文章大全 >> 网络编程 >> XML学习

xml 解析类(php版)

【 来源:网络  更新时间:2005-6-15 | 字体:
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 分析类.上面是实用的例子,返回结果是一个二维数组 格式 $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();
?>
相 关 文 章
相 关 软 件

音乐
嫁衣 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 没有人比我更爱你
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 降临 下雨天 小酒窝 樱花草 恋爱新手 说唱脸谱 红色高跟鞋 寂寞才说爱 深深爱过你 爱上你是个错 即使知道要见面 不是因为寂寞才想你
城府 假如 花海 兰亭序 棉花糖 舍不得 最后一次 女人如烟 外滩十八号 我们的纪念 我们的无奈 心在跳情在烧 爱上你是我的错 爱情里没有谁对谁错
加入收藏留言建议自助友情链接普通友情链接站长的Blog
版权所有   COPYRIGHT 2002-2009 ★IT学习者★ ALL RIGHTS RESERVED.