欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP用SAX解析XML的實(shí)現(xiàn)代碼與問題分析

 更新時(shí)間:2011年08月22日 22:11:17   作者:  
近日在做一個(gè)解析XML的小程序,因?yàn)榉?wù)器是PHP4的,XML解析函數(shù)只能用SAX方式的xml_parser來解析了。
復(fù)制代碼 代碼如下:

<?php
$g_books = array();
$g_elem = null;
function startElement( $parser, $name, $attrs )
{
global $g_books, $g_elem;
if ( $name == 'BOOK' ) $g_books []= array();
$g_elem = $name;
}
function endElement( $parser, $name )
{
global $g_elem;
$g_elem = null;
}
function textData( $parser, $text )
{
global $g_books, $g_elem;
if ( $g_elem == 'AUTHOR' ||
$g_elem == 'PUBLISHER' ||
$g_elem == 'TITLE' )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
}
}
$parser = xml_parser_create();
xml_set_element_handler( $parser, "startElement", "endElement" );
xml_set_character_data_handler( $parser, "textData" );
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
xml_parser_free( $parser );
foreach( $g_books as $book )
{
echo $book['TITLE']." - ".$book['AUTHOR']." - ";
echo $book['PUBLISHER']."\n";
}
?>

PHP中用SAX方式解析XML發(fā)現(xiàn)的問題
XML如下:
so.xml
復(fù)制代碼 代碼如下:

<?xml version="1.0" encoding="GBK"?>
<result>
<row>
<id>1047869</id>
<date>2008-08-28 14:54:51</date>
<title>紅花還需綠葉扶--淺談腳架云臺(tái)的選購(gòu)</title>
<summary>很多專業(yè)攝影師在選購(gòu)三腳架的時(shí)候,往往出手闊綽,3、4000元一個(gè)的捷信或者曼富圖三腳架常常不用經(jīng)過思考就買下來了,可是,他們卻總是忽視了云臺(tái)的精挑細(xì)眩其實(shí),數(shù)碼相機(jī)架在三腳架上面究竟穩(wěn)不穩(wěn),起決定作用的是云臺(tái),那么我們?nèi)绾尾拍芴暨x到一款穩(wěn)如磐石的云臺(tái)呢?云臺(tái)家族種類繁多用途迥異簡(jiǎn)單的說,腳架云臺(tái)是用于連接相機(jī)與腳架進(jìn)行角度調(diào)節(jié)的部件,主要分成三維云臺(tái)和球型云臺(tái)。三維云臺(tái)在橫向旋轉(zhuǎn)</summary>
</row>
...(省略若干行)
</result>

xml_class.php
復(fù)制代碼 代碼如下:

<?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
復(fù)制代碼 代碼如下:

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

最后得到的結(jié)果中summary中的數(shù)據(jù)少了很多,總是得不到完整的summary內(nèi)容。有時(shí)還會(huì)得到亂碼,在網(wǎng)上也找了半天也不知道是什么問題引起的。
  后來才發(fā)現(xiàn)問題是因?yàn)閤ml_parser解析XML是循環(huán)處理節(jié)點(diǎn)中的數(shù)據(jù)的,每次只取大概300個(gè)字符長(zhǎng)度(具體是多少,我也不太清楚,只是用strlen輸出大概在300左右),于是才知道是因?yàn)槊看蔚难h(huán)就會(huì)把前次的數(shù)據(jù)給復(fù)蓋了,這樣就會(huì)出現(xiàn)數(shù)據(jù)不全的問題。
  解決辦法就是把xml_class文件中的xml類中的cdata方法中$this->data[$this->i][$tagname] = $cdata;改為$this->data[$this->i][$tagname] .= $cdata;即可解決(其中有一些NOTICE錯(cuò)誤,PHP已忽略了).

相關(guān)文章

  • PHP實(shí)現(xiàn)微信JS-SDK接口選擇相冊(cè)及拍照并上傳的方法

    PHP實(shí)現(xiàn)微信JS-SDK接口選擇相冊(cè)及拍照并上傳的方法

    這篇文章主要介紹了PHP實(shí)現(xiàn)微信JS-SDK接口選擇相冊(cè)及拍照并上傳的方法,涉及php微信接口的調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • 深入解析PHP的Yii框架中的event事件機(jī)制

    深入解析PHP的Yii框架中的event事件機(jī)制

    這篇文章主要介紹了PHP的Yii框架中的event事件機(jī)制,文中講解了Yii的事件處理器以及給組件對(duì)象綁定事件處理函數(shù)等重要知識(shí),需要的朋友可以參考下
    2016-03-03
  • nginx下安裝php7+php5

    nginx下安裝php7+php5

    本文給大家分享的是在nginx下安裝php7,并且實(shí)現(xiàn)與php5共存,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-07-07
  • PHP實(shí)現(xiàn)基本留言板功能原理與步驟詳解

    PHP實(shí)現(xiàn)基本留言板功能原理與步驟詳解

    這篇文章主要介紹了PHP實(shí)現(xiàn)基本留言板功能,結(jié)合實(shí)例形式分析了PHP實(shí)現(xiàn)基本留言板功能的相關(guān)原理、數(shù)據(jù)庫(kù)構(gòu)建、功能實(shí)現(xiàn)等步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • Thinkphp框架安裝composer擴(kuò)展包流程梳理

    Thinkphp框架安裝composer擴(kuò)展包流程梳理

    這篇文章主要介紹了Thinkphp使用composer安裝擴(kuò)展包教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • PHP實(shí)現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片示例

    PHP實(shí)現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)將base64編碼字符串轉(zhuǎn)換成圖片,涉及php編碼轉(zhuǎn)換、文件讀寫等簡(jiǎn)單處理技巧,需要的朋友可以參考下
    2018-06-06
  • PHP使用glob函數(shù)遍歷目錄或文件夾的方法

    PHP使用glob函數(shù)遍歷目錄或文件夾的方法

    這篇文章主要介紹了PHP使用glob函數(shù)遍歷目錄或文件夾的方法,對(duì)比分析了使用glob函數(shù)遍歷目錄的優(yōu)點(diǎn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 如何在symfony中導(dǎo)出為CSV文件中的數(shù)據(jù)

    如何在symfony中導(dǎo)出為CSV文件中的數(shù)據(jù)

    如果您需要在symfony中將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為CSV文件,試試這個(gè)
    2011-10-10
  • PHP設(shè)計(jì)模式之裝飾器模式實(shí)例詳解

    PHP設(shè)計(jì)模式之裝飾器模式實(shí)例詳解

    這篇文章主要介紹了PHP設(shè)計(jì)模式之裝飾器模式,簡(jiǎn)單介紹了裝飾器模式的概念、功能并結(jié)合實(shí)例形式詳細(xì)分析了php實(shí)現(xiàn)與使用裝飾器模式的相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • PHPExcel簡(jiǎn)單讀取excel文件示例

    PHPExcel簡(jiǎn)單讀取excel文件示例

    這篇文章主要介紹了PHPExcel簡(jiǎn)單讀取excel文件的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了PHPExcel針對(duì)Excel文件的讀取操作技巧,需要的朋友可以參考下
    2016-05-05

最新評(píng)論