ホームページ  >  記事  >  バックエンド開発  >  PHPとXML:expat関数の使い方(2)

PHPとXML:expat関数の使い方(2)

黄舟
黄舟オリジナル
2016-12-19 13:23:05983ブラウズ

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 Newsboy を PHP クラスに変換し、レイアウトを簡単に変更できるようにしました。生成される HTML も少し読みやすくなりました。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 (開始または停止の際にそれぞれマークされる) で、対応する数値グループのインデックス値として
が使用されます。果那个键値が存在すると、値が返され、クラスの 'html' プロパティの後面に追加されます。
'html' プロパティは、今後私が実際に文書コンテンツを表示するときに使用されます。

characterData メソッドは、マーク間の値をクラスに追加します

に登録された呼び出し PIHandler のメソッドは、関数の 1 つであり、まだ実装されていません。 存在する場合は、XML
テキスト内で php スクリプトが直接処理されます。さて、メインの解析メソッド呼び出しについて説明しましょう、何でしょう、parse()!!!

最初の行は関数 xml_parser_create() を呼び出します。これは expat XML パーサー インスタンスを返し、
attribute&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 ファイルを読み取って解析するだけです。エラーが発生した場合は、エラーが発生した行番号を含むエラーの詳細が返されます。

上記は PHP と XML の内容です: expat 関数の使用 (2) 関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。