PHP と XML: useexpat 関数数(二)
次の手順でこの文書を処理する PHP 番号を確認します。
/*NewsBoy : Justin Grant によって PHP で書かれた Web 用ニュース システム (Web: jusgrant.cjb.netまたは justin.host.za.net Mail: justin@glendale.net) 3 月 25 日 V0.0.2 Newsboy を 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; format= $this->close_tag[$name]) { $this->html .= $format; } }
function CharacterData($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))); } } }}
?>
---------------------------------------------- ----------------------------------
この類の工作関数中、我创建了打开与关闭2 つのマークの数グループ。
の後で分析する予定のマークは
のようなもので、対応する値には、マークの HTML コードが含まれています。単純な分析機能関数用この関数は、PHP がオブジェクトの解放時に自動調整する種類の解析構造関数をサポートしていないため、手動で調整する必要はありません。また、私たちは、オンとオフのマークにデータがある場合に
を使用して、データを個別にフォーマット化し、後でこれらをどのように処理するかを示すデータ分析方法を定義しました。メソッドをアナライザーに追加します。
startElement と closeElement (開始または停止のいずれかを分析するときにそれぞれ使用されます) で、対応する数グループのインデックス値として
が使用されます。果那个键
characterData メソッドは、マーク間の値を単独でクラスに追加します。
登録されている呼び出し PIHandler のメソッドは、関数の 1 つであり、まだ実現されていません。次の主要な分析方法の解析用、パース一猜、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 ファイルを読み取って解析するだけです。エラーが発生した場合は、エラー
が発生した行番号を含むエラーの詳細が返されます。
http://www.bkjia.com/PHPjc/316795.html
)