• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP用SAX解析XML的实现代码与问题分析_php技巧

php 搞代码 3年前 (2022-01-26) 20次浏览 已收录 0个评论
 <BR><?php <BR>$g_books = array(); <BR>$g_elem = null; <BR>function startElement( $parser, $name, $attrs ) <BR>{ <BR>global $g_books, $g_elem; <BR>if ( $name == 'BOOK' ) $g_books []= array(); <BR>$g_elem = $name; <BR>} <BR>function endElement( $parser, $name ) <BR>{ <BR>global $g_elem; <BR>$g_elem = null; <BR>} <BR>function textData( $parser, $text ) <BR>{ <BR>global $g_books, $g_elem; <BR>if ( $g_elem == 'AUTHOR' || <BR>$g_elem == 'PUBLISHER' || <BR>$g_elem == 'TITLE' ) <BR>{ <BR>$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text; <BR>} <BR>} <BR>$parser = xml_parser_create(); <BR>xml_set_element_handler( $parser, "startElement", "endElement" ); <BR>xml_set_character_data_handler( $parser, "textData" ); <BR>$f = fopen( 'books.xml', 'r' ); <BR>while( $data = fread( $f, 4096 ) ) <BR>{ <BR>xml_parse( $parser, $data ); <BR>} <BR>xml_parser_free( $parser ); <BR>foreach( $g_books as $book ) <BR>{ <BR>echo $book['TITLE']." - ".$book['AUTHOR']." - "; <BR>echo $book['PUBLISHER']."\n"; <BR>} <BR>?> <BR>


PHP中用SAX方式解析XML发现的问题
XML如下:
so.xml

 <BR><?xml version="1.0" encoding="GBK"?> <BR> <BR> <BR>1047869 <BR>2008-08-28 14:54:51 <BR><title>红花还需绿叶扶--浅谈脚架云台的选购</title> <BR><summary>很多专业摄影师在选购三脚架的时候,往往出手阔绰,3、4000元一个的捷信或者曼富图三脚架常常不用经过思考就买下来了,可是,他们却总是忽视了云台的精挑细眩其实,数码相机架在三脚架上面究竟稳不稳,起决定作用的是云台,那么我们如何才能挑选到一款稳如磐石的云台呢?云台家族种类繁多用途迥异简单的说,脚架云台是用于连接相机与脚架进行角度调节的部件,主要分成三维云台和球型云台。三维云台在横向旋转</summary> <BR> <BR>...(省略若干行) <BR> <BR>


xml_class.php

 <BR><?php <BR>class xml { <BR>var $parser; <BR>var $i =0; <BR>var $search_result = array(); <BR>var $row = array(); <BR>var $data = array(); <BR>var $now_tag; <BR>var $tags = array("ID", "CLASSID", "SUBCLASSID", "CLASSNAME", "TITLE", "SHORTTITLE", "AUTHOR", "PRODUCER", "SUMMARY", "CONTENT", "DATE"); <BR>function xml() <BR>{ <BR>$this->parser = xml_parser_create(); <BR>xml_set_object($this->parser, $this); <BR>xml_set_element_handler($this->parser, "tag_open", "tag_close"); <BR>xml_set_character_data_handler($this->parser, "cdata"); <BR>} <BR>function parse($data) <BR>{ <BR>xml_parse($this->parser, $data); <BR>} <BR>function tag_open($parser, $tag, $attributes) <BR>{ <BR>$this->now_tag=$tag; <BR>if($tag=='RESULT') { <BR>$this->search_result = $attributes; <BR>} <BR>if($tag=='ROW') { <BR>$this->row[$this->i] = $attributes; <BR>} <BR>} <BR>function cdata($parser, $cdata) <BR>{ <BR>if(in_array($this->now_tag, $this->tags)){ <BR>$tagname = strtolower($this->now_tag); <BR>$this->data[$this->i][$tagname] =<mark style="color:transparent">来4源gaodaimacom搞#代%码*网</mark><code>搞代gaodaima码</code> $cdata; <BR>} <BR>} <BR>function tag_close($parser, $tag) <BR>{ <BR>$this->now_tag=""; <BR>if($tag=='ROW') { <BR>$this->i++; <BR>} <BR>} <BR>} <BR>?> <BR>


search.php

 <BR><?php <BR>require_once("./xml_class.php"); <BR>$xml = file_get_contents("./so.xml"); <BR>$xml_parser = new xml(); <BR>$xml_parser->parse($xml); <BR>print_r($xml_parser); <BR>?> <BR>


最后得到的结果中summary中的数据少了很多,总是得不到完整的summary内容。有时还会得到乱码,在网上也找了半天也不知道是什么问题引起的。
  后来才发现问题是因为xml_parser解析XML是循环处理节点中的数据的,每次只取大概300个字符长度(具体是多少,我也不太清楚,只是用strlen输出大概在300左右),于是才知道是因为每次的循环就会把前次的数据给复盖了,这样就会出现数据不全的问题。
  解决办法就是把xml_class文件中的xml类中的cdata方法中$this->data[$this->i][$tagname] = $cdata;改为$this->data[$this->i][$tagname] .= $cdata;即可解决(其中有一些NOTICE错误,PHP已忽略了).


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP用SAX解析XML的实现代码与问题分析_php技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址