xml 解析类
程序员文章站
2022-06-28 16:13:53
xml 解析类
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();
?>
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();
?>