xml 解析类

  xml 解析类 <?php

  ob_start();

  /*

  * Copyright (c) 2003 NightKids  <[email protected]>

  * 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();

  ?>