最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP用SAX解析XML的實現代碼與問題分析

 更新時間:2011年08月22日 22:11:17   作者:  
近日在做一個解析XML的小程序,因為服務器是PHP4的,XML解析函數只能用SAX方式的xml_parser來解析了。
復制代碼 代碼如下:

<?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ā)現的問題
XML如下:
so.xml
復制代碼 代碼如下:

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

xml_class.php
復制代碼 代碼如下:

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

<?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內容。有時還會得到亂碼,在網上也找了半天也不知道是什么問題引起的。
  后來才發(fā)現問題是因為xml_parser解析XML是循環(huán)處理節(jié)點中的數據的,每次只取大概300個字符長度(具體是多少,我也不太清楚,只是用strlen輸出大概在300左右),于是才知道是因為每次的循環(huán)就會把前次的數據給復蓋了,這樣就會出現數據不全的問題。
  解決辦法就是把xml_class文件中的xml類中的cdata方法中$this->data[$this->i][$tagname] = $cdata;改為$this->data[$this->i][$tagname] .= $cdata;即可解決(其中有一些NOTICE錯誤,PHP已忽略了).

相關文章

  • php中判斷文件存在是用file_exists還是is_file的整理

    php中判斷文件存在是用file_exists還是is_file的整理

    在寫程序時發(fā)現在判斷文件是否存在時,有兩種寫法,有的人用了is_file,有的人用了file_exists,用哪個更好或者說更合適呢
    2012-09-09
  • php定義一個參數帶有默認值的函數實例分析

    php定義一個參數帶有默認值的函數實例分析

    這篇文章主要介紹了php定義一個參數帶有默認值的函數,實例分析了php參數帶有默認值的函數使用技巧,需要的朋友可以參考下
    2015-03-03
  • php ImageMagick windows下安裝教程

    php ImageMagick windows下安裝教程

    這篇文章主要介紹了php ImageMagick windows下安裝教程,本文詳細講解了windows下安裝ImageMagick的步驟、包括下載、安裝、擴展安裝、測試等步驟,需要的朋友可以參考下
    2015-01-01
  • 如何使用php等比例縮放圖片

    如何使用php等比例縮放圖片

    主要介紹了如何使用php等比例縮放圖片,可以對原圖片提出縮放要求的寬度、縮放的長度.
    2016-10-10
  • php 圖像函數大舉例(非原創(chuàng))

    php 圖像函數大舉例(非原創(chuàng))

    PHP自4.3版本開始,捆綁了自己的GD2庫,用戶可以自己下載并設置.如果要查看自己的php版本是否支持gd模塊(支持JPEG,PNG,WBMP但不再支持GIF)
    2009-06-06
  • php 獲取文件行數的方法總結

    php 獲取文件行數的方法總結

    本文章向大家介紹php獲取文件行數的三種方法,第一種方法是使用feof和fgets函數,第二種方法是使用stream_get_line函數,第三種方法是使用count函數,具體實現請看下面實例
    2016-10-10
  • PHP引用符&的用法詳細解析

    PHP引用符&的用法詳細解析

    以下是對PHP中引用符&的用法進行了詳細的分析介紹。需要的朋友可以過來參考下
    2013-08-08
  • PHP編程中的常見漏洞和代碼實例

    PHP編程中的常見漏洞和代碼實例

    這篇文章主要介紹了PHP編程中的常見漏洞和代碼實例,本文對編程中的一些常見漏洞做了總結,并對如何防范做了講解,需要的朋友可以參考下
    2014-08-08
  • PHP7.1安裝yaf擴展的方法

    PHP7.1安裝yaf擴展的方法

    下面小編就為大家分享一篇PHP7.1安裝yaf擴展的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • php常用表單驗證類用法實例

    php常用表單驗證類用法實例

    這篇文章主要介紹了php常用表單驗證類用法,實例分析了php針對表單元素常用驗證技巧,需要的朋友可以參考下
    2015-06-06

最新評論

英超| 建宁县| 都江堰市| 北海市| 恩施市| 峨山| 鹰潭市| 府谷县| 桦南县| 汤阴县| 隆回县| 美姑县| 怀安县| 乌鲁木齐市| 黑龙江省| 池州市| 嘉禾县| 溆浦县| 麻栗坡县| 孟村| 同德县| 甘泉县| 会东县| 海安县| 通江县| 恩平市| 利川市| 渭源县| 哈巴河县| 福贡县| 阳泉市| 札达县| 綦江县| 肥东县| 台安县| 尖扎县| 灯塔市| 革吉县| 体育| 广宗县| 吴川市|