ホームページ  >  記事  >  バックエンド開発  >  PHP は SAX を使用して XML 実装コードを解析し、問題を分析します_PHP チュートリアル

PHP は SAX を使用して XML 実装コードを解析し、問題を分析します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:25:18817ブラウズ

复制代码代码如下:

$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;
}
関数 textData( $parser, $text )
{
global $g_books, $g_elem;
if ( $g_elem == '著者' ||
$g_elem == '出版社' ||
$g_elem == 'TITLE' )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $テキスト;
}
}
$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 公開の问题
XML 如下:
so.xml
复制代 代码如下:

<結果>
<行>
1047869
2008-08-28 14:54:51日付>
红花还需要绿叶扶--浅谈脚架云台の选购
很多专业摄影师在选购三脚架的時候,往往出手阔绰,3,4000元一的捷信或者曼富图三脚架常常不用经过思惟下来了,可以,他去总是忽視了云台の精挑细眩其实,数码相机架在三脚架上面究竟稳不稳,起定定作用的是云台,那么我们 どのように一款稳如磐石に挑戦することができるか?簡単に言えば、フレームクラウド台は、角度調整のためにコンピュータとフレームを接続するための部品であり、主に横方向に回転する三連クラウド台とボール型クラウド台に分かれる。

...(一部行省略)


xml_class.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", "クラスID", "サブクラスID", "クラス名", "タイトル", "ショートタイトル", "著者", "プロデューサー", "概要", "コンテンツ", "日付" );
関数 xml()
{
$this->parser = xml_parser_create();
xml_set_object($this->パーサー, $this);
xml_set_element_handler($this->parser, "tag_open", "tag_close");
xml_set_character_data_handler($this->parser, "cdata");
}
関数 parse($data)
{
xml_parse($this->parser, $data);
}
関数 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 = strto lower($this->now_tag) ;
$this->data[$this->i][$tagname] = $cdata;
}
}
function tag_close($parser, $tag)
{
$this->now_tag="";
if($tag=='ROW') {
$this->i++;
}
}
}
?>

search.php
复制代码代码如下:

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

最終結果では、サマリー内のデータははるかに少なくなり、完全なサマリー コンテンツは決して取得されません。時々コードが文字化けすることがあり、ネットで長時間検索しても何が原因なのかわかりません。
問題は、xml_parser が XML を解析してノード内のデータをループで処理し、毎回長さが約 300 文字しかかからなかったためであることが判明しました (具体的な長さはわかりません。出力に strlen を使用しただけです)約 300)、そのとき初めて、それは各サイクルで前のデータが上書きされ、不完全なデータの問題が発生するためであることに気づきました。
解決策は、xml_class ファイルの xml クラスの cdata メソッドの $this->data[$this->i][$tagname] = $cdata; を $this->data[$this] に変更することです。 - >i][$tagname] .= $cdata; は解決できます (PHP は無視するいくつかの NOTICE エラーがあります)。

http://www.bkjia.com/PHPjc/324133.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/324133.html技術記事次のようにコードをコピーします: ?php $g_books = array(); $g_elem = null; function startElement( $parser, $name, $attrs ) { global $g_books, $g_elem if ( $name == 'BOOK' ) $ g_books []=...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Curl、socket、file_get_contents の 3 つのメソッドを使用して PHP_PHP チュートリアルでデータを POST する次の記事:Curl、socket、file_get_contents の 3 つのメソッドを使用して PHP_PHP チュートリアルでデータを POST する

関連記事

続きを見る