PHP用SAX解析XML的实现代码与问题分析
|
<div class="codetitle"><a style="CURSOR: pointer" data="1250" class="copybut" id="copybut1250" onclick="doCopy('code1250')"> 代码如下:<div class="codebody" id="code1250"> PHP中用SAX方式解析XML发现的问题 XML如下: so.xml <div class="codetitle"><a style="CURSOR: pointer" data="92964" class="copybut" id="copybut92964" onclick="doCopy('code92964')"> 代码如下:<div class="codebody" id="code92964"> <?xml version="1.0" encoding="GBK"?> ...(省略若干行) xml_class.php <div class="codetitle"><a style="CURSOR: pointer" data="70938" class="copybut" id="copybut70938" onclick="doCopy('code70938')"> 代码如下:<div class="codebody" id="code70938"> <?php class xml { var $parser; var $i =0; var $search_result = array(); var $row = array(); var $data = array(); var $now_tag; var $tags = array("ID","CLASSID","SUBCLASSID","CLASSNAME","TITLE","SHORTTITLE","AUTHOR","PRODUCER","SUMMARY","CONTENT","DATE"); function xml() { $this->parser = xml_parser_create(); xml_set_object($this->parser,$this); xml_set_element_handler($this->parser,"tag_open","tag_close"); xml_set_character_data_handler($this->parser,"cdata"); } function parse($data) { xml_parse($this->parser,$data); } function tag_open($parser,$tag,$attributes) { $this->now_tag=$tag; if($tag=='RESULT') { $this->search_result = $attributes; } if($tag=='ROW') { $this->row[$this->i] = $attributes; } } function cdata($parser,$cdata) { if(in_array($this->now_tag,$this->tags)){ $tagname = strtolower($this->now_tag); $this->data[$this->i][$tagname] = $cdata; } } function tag_close($parser,$tag) { $this->now_tag=""; if($tag=='ROW') { $this->i++; } } } ?> search.php <div class="codetitle"><a style="CURSOR: pointer" data="10459" class="copybut" id="copybut10459" onclick="doCopy('code10459')"> 代码如下:<div class="codebody" id="code10459"> <?php require_once("./xml_class.php"); $xml = file_get_contents("./so.xml"); $xml_parser = new xml(); $xml_parser->parse($xml); print_r($xml_parser); ?> 最后得到的结果中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已忽略了). (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
