PHP と XML:expat 関数数(二)を使用します
この文書を処理する次の PHP コードを確認します。
/*NewsBoy : Justin Grant によって PHP で書かれた Web 用のニュース システム (Web: jusgrant.cjb.net または justin. host.za.net Mail: justin@glendale.net) 3 月 25 日 V0.0.2 ニュースボーイを PHP クラスに変換し、レイアウトを簡単に変更できるようにしました。生成される HTML も少し読みやすくなりました。 3 月 24 日 V0.0.1 非常に大まかで基本的な初期バージョンが完成しました。*/
class newsboy { var $xml_parser; var $xml_file;変数$html; var $open_tag ; var $close_tag ;
//クラス コンストラクター
function newsboy() { $this->xml_parser = ""; $this->xml_file = ""; $this->html = ""; $this->open_tag = array(
//これらはデフォルト設定ですが、非常に簡単に変更できます
"NEWSBOY" => "nn", "STORY" => " ", "DATE" => ""、"SLUG" => ""、"PIC" => "" ); $this->close_tag = array( "ニュースボーイ" => "
nnn", "ストーリー" => "", "日付" => "", "スラッグ" => "
", "テキスト" => "n", "PIC" => " "
" ); }
//クラス デストラクター (PHP はデストラクターをサポートしていないため、手動で呼び出す必要があります)
function destroy() { xml_parser_free($this- >xml_parser); }
//クラスメンバー
function concat($str) { $this->html .= $str; }
function startElement($parser, $name, $attrs) { //global $open_tag ; if ($format= $this->open_tag[$name]) { $this->html .= $format; }
function endElement($parser, $name) { global $close_tag; = $this->close_tag[$name]) { $this->html .= $format; } }
functioncharacterData($parser, $data) { $this->html .= $data; } /* function PIHandler($parser, $target, $data) { //switch (strto lower($target)){ // case "php": eval($data); //} }*/
function parse() { $this->xml_parser = xml_parser_create(); xml_set_object($this->xml_parser, &$this); // $map_array でタグを確実に見つけることができるようにします
xml_parser_set_option( $this->xml_parser、XML_OPTION_CASE_FOLDING、true); xml_set_element_handler($this->xml_parser, "startElement", "endElement"); xml_set_character_data_handler($this->xml_parser, "characterData");//xml_set_processing_instruction_handler($this->xml_parser, "PIHandler");
if (!($fp = fopen($this->xml_file, "r"))) { die("XML 入力を開けませんでした"); } while ($data = fread($fp, 4096)) { if (!xml_parse($this->xml_parser, $data, feof($fp))) { die(sprintf("XML エラー: %s 行目) %d", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser))); } } }}
?>
------------------------------------------------- -------------------------------
この類の構造関数中、我创建立打开与关闭二标记数组一連の関連キーワードと私が次に分析するマークは
と同様であり、それらの対応する値には、関連キーワードで始まる形式化された HTML コードが含まれています。们不再
PHP は、オブジェクトの起動時に自動調整するタイプの解析関数をサポートしていないため、この関数は手動で調整することができません。私たちはまた、データ分析方法を定義しました。これは、データが存在するときに
を使用して、データに個別の形式化を実行します。次に、これらの方法を分析に適用する方法を説明します。
startElement と closeElement (オープンまたはクローズを分析するときにそれぞれ使用されます) で、マークされた名前
がインデックス値として使用され、対応する数値グループが検査されます。そして
'html' プロパティは、後で私が実際にテキストのコンテンツを表示するときに使用します。存在する場合は、XML
テキスト内で php スクリプトを直接処理します。猜一猜、parse()!!!
最初に関数 xml_parser_create() が使用され、expat の xml アナライザーの例が返され、
プロパティ &this->xml_parser 内に保存されます。
次に、関数 xml_set_object() を使用して、クラスメソッドのコールバック関数を登録する必要があります。
私の使い方は、xml_set_object($this->xml_parser, &$this)です。最初のパラメータで、
で XML パーサーを保持するクラス属性を指定し、2 番目のパラメータで PHP オブジェクトのインスタンス アドレスを指定しました。これにより、アナライザーは、登録されるすべてのコールバック関数が、そのアドレスにある指定されたクラスの実際のメソッドであることを認識できます。これは、C または C++ の「参照渡し」に似ており、単純に「参照変数」と呼ぶ人もいます。
次の行では、xml_parser_set_option() を呼び出して、case
folding を使用して XML パーサー属性を設定します。大文字と小文字の折りたたみは、XML 文書を解析するときに大文字と小文字の区別を気にしないことをパーサーに伝えるだけですが、
または のような 2 つの異なるタグを定義するために大文字と小文字の区別を使用したい場合は、未設定のままにすることができます。
xml_set_element_handler()を使用して、
「startElement」と「endElement」という名前の開始タグと終了タグのコールバック関数を指定します。
次に、xml_set_character_data_handler() を使用して、文字データ処理ハンドルを
characterData() という名前のコールバック関数として指定します。注釈付きの関数呼び出し xml_set_processing_instruction_handler()
は、関数 PIHandler() を登録するために使用した呼び出しです。 PIHandler を XML ドキュメントに含めて、PHP コードを処理できます。
コードの残りの部分は、XML ファイルを読み取って解析するだけです。エラーが発生した場合は、エラー
が発生した行番号を含むエラーの詳細が返されます。
上記では、Express Gate の内容を含め、Express Gate PHP と XML: using expat function 2 を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。