当前位置: 移动技术网 > IT编程>网页制作>XML > xml 解析类

xml 解析类

2017年12月08日  | 移动技术网IT编程  | 我要评论
xml 解析类 <?php ob_start(); /*   

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网