ホームページ  >  記事  >  バックエンド開発  >  export_symbol php XML 分析関数コード ページ 1/2

export_symbol php XML 分析関数コード ページ 1/2

WBOY
WBOYオリジナル
2016-07-29 08:38:441036ブラウズ

まず最初に、私はコンピューターの標準が大好きであることを認めなければなりません。もし誰もが業界の標準に従えば、インターネットはより良いメディアになるでしょう。標準化されたデータ交換フォーマットの使用により、オープンでプラットフォームに依存しないコンピューティング モデルが実現可能になります。それが私が XML 愛好家である理由です。
幸いなことに、私のお気に入りのスクリプト言語は XML をサポートしているだけでなく、さらに多くのサポートを受けています。 PHP を使用すると、XML ドキュメントをインターネットにすばやく公開したり、XML ドキュメントに関する統計情報を収集したり、XML ドキュメントを他の形式に変換したりすることができます。たとえば、私は XML で書いた記事や書籍を管理するために、PHP の XML 処理機能をよく使用します。
この記事では、PHP の組み込み Expat パーサーを使用して XML ドキュメントを処理する方法について説明します。例を通して、Expat の処理方法を説明します。同時に、例では次の方法を説明できます:
独自の処理関数を構築する
XML ドキュメントを独自の PHP データ構造に変換する
Expat を導入する
XML プロセッサーとも呼ばれる XML パーサーにより、プログラムが XML ドキュメントの構造とコンテンツにアクセスできるようになります。 Expat は、PHP スクリプト言語用の XML パーサーです。
Mozilla、Apache、Perl などの他のプロジェクトでも使用されています。
イベントベースのパーサーとは何ですか?
XML パーサーの 2 つの基本的なタイプ:
ツリーベースのパーサー: XML ドキュメントをツリー構造に変換します。このタイプのパーサーは、結果のツリーの各要素にアクセスするための API を提供しながら、記事全体を解析します。一般的に使用される標準は DOM (Document Object Mode) です。
イベントベースのパーサー: XML ドキュメントを一連のイベントとして扱います。特別なイベントが発生すると、パーサーは開発者が提供する関数を呼び出してそれを処理します。
イベントベースのパーサーは、XML ドキュメントのデータ中心のビューを備えています。これは、XML ドキュメントの構造ではなく、データ部分に焦点を当てていることを意味します。これらのパーサーはドキュメントを最初から最後まで処理し、コールバック関数を通じて要素の開始、要素の終了、特徴データの開始などのイベントをアプリケーションに報告します。以下は「Hello-World」XML ドキュメントの例です:

Hello World

イベントベースのパーサーは 3 つのイベントとして報告します:
開始要素: 挨拶
CDATA 項目の開始値: Hello World
終了要素: 挨拶
ツリーベースのパーサーとは異なり、イベントベースのパーサーはドキュメントを記述する構造を生成しません。 CDATA アイテムでは、イベントベースのパーサーでは親要素
greeting に関する情報を取得できません。
ただし、より低いレベルのアクセスが提供されるため、リソースの有効活用とより高速なアクセスが可能になります。この方法では、ドキュメント全体をメモリに収める必要はありません
; 実際、ドキュメント全体が実際のメモリ値よりも大きくなる可能性もあります。
Expat は、このようなイベントベースのパーサーです。もちろん、Expat を使用する場合は、必要に応じて PHP で完全なネイティブ ツリー構造を生成することもできます。
上記の Hello-World の例には、完全な XML 形式が含まれています。ただし、関連付けられた DTD (Document Type Definition) も埋め込まれた DTD も存在しないため、これは無効です。
Expat では、これに違いはありません。Expat は有効性をチェックしないパーサーであるため、ドキュメントに関連付けられた DTD を無視します。ただし、ドキュメントは完全な形式である必要があることに注意してください。そうでないと、Expat (他の XML 準拠のパーサーと同様) がエラー メッセージを表示して停止します。
有効性をチェックしないパーサーとして、Exapt は速度と軽量であるため、インターネット プログラムに最適です。
Expat のコンパイル
Expat は PHP3.0.6 バージョン (またはそれ以降) にコンパイルできます。 Apache 1.3.9 以降、Expat は Apache の一部として含まれています。 Unix システムでは、-with
-xml オプションを使用して PHP を構成することで、PHP にコンパイルできます。
PHP を Apache モジュールとしてコンパイルすると、デフォルトで Expat が Apache の一部として含まれます。 Windows では、XML ダイナミック リンク ライブラリをロードする必要があります。
XML の例: XMLstats
Expat の関数を理解する 1 つの方法は、例を通して見ることです。これから説明する例では、Expat を使用して XML ドキュメントの統計を収集します。
ドキュメント内の各要素について、次の情報が出力されます:
ドキュメント内で要素が使用された回数
要素内の文字データの量
要素の親要素
要素の子要素
注: デモの目的で、PHP を使用して要素の親要素と子要素を保存する構造を生成します。
準備
XML パーサー インスタンスの生成に使用される関数は、xml_parser_create() です。このインスタンスは、今後のすべての関数に使用されます。この考え方は、PHP の MySQL 関数の
connection タグに非常に似ています。通常、イベントベースのパーサーでは、ドキュメントを解析する前に、特定のイベントが発生したときに呼び出されるコールバック関数を登録する必要があります。Expat には次の 7 つの例外イベントが定義されています:
オブジェクト XML 解析関数の説明
要素 xml_set_element_handler() 要素の始まりと終わり
文字データ xml_set_character_data_handler() 文字データの始まり
外部エンティティ xml_set_external_entity_ref_handler()外部エンティティの出現
未解析の外部エンティティ xml_set_unparsed_entity_decl_handler() 未解決の外部エンティティの発生
処理命令の発生 xml_set_processing_instruction_handler() 処理命令の発生
表記法宣言の発生 xml_set_notation_decl_handler() 表記法宣言の発生
デフォルト xml_set_default_ハンドラー( ) 指定されたハンドラー関数のないその他のイベント
すべて コールバック関数は、(他の引数に加えて) 最初の引数としてパーサーのインスタンスを取る必要があります。
この記事の最後にあるサンプル スクリプトについては、注意が必要なのは、要素処理関数と文字データ処理関数の両方を使用していることです。要素のコールバック ハンドラー関数は、
xml_set_element_handler() を通じて登録されます。
この関数には 3 つのパラメータが必要です:
パーサーのインスタンス
開始要素を処理するコールバック関数の名前
終了要素を処理するコールバック関数の名前
XML ドキュメントの解析を開始するときにコールバック関数が存在する必要があります。これらは、PHP マニュアルに記載されているプロトタイプと一致して定義する必要があります。
たとえば、Expat は開始要素のハンドラー関数に 3 つのパラメーターを渡します。スクリプト例では、次のように定義されています:
function start_element($parser, $name, $attrs)
最初のパラメータはパーサー識別子、2 番目のパラメータは開始要素の名前、3 番目のパラメータにはすべてが含まれます要素の属性と値の配列。
XML ドキュメントの解析を開始すると、Expat は開始要素に遭遇するたびに start_element() 関数を呼び出してパラメーターを渡します。
XML 大文字と小文字の折りたたみオプション
xml_parser_set_option () 関数を使用して、大文字と小文字の折りたたみオプションをオフにします。このオプションはデフォルトでオンになっており、ハンドラー関数に渡される要素名が自動的に
大文字に変換されます。ただし、XML では大文字と小文字が区別されます (したがって、統計 XML ドキュメントでは大文字と小文字が非常に重要です)。この例では、ケース折りたたみオプションをオフにする必要があります。
ドキュメントを解析します
すべての準備が完了したら、スクリプトは最終的に XML ドキュメントを解析できます:
Xml_parse_from_file()、パラメーターで指定されたファイルを開いて 4kb サイズで解析するカスタム関数
xml_parse() および xml_parse_from_file と同様() でエラーが発生した場合、つまり XML 文書の形式が不完全な場合は false が返されます。
xml_get_error_code() 関数を使用して、最後のエラーの数値コードを取得できます。この数値コードを xml_error_string() 関数に渡して、
エラー テキスト メッセージを取得します。
XML の現在の行番号を出力し、デバッグを容易にします。
解析プロセス中に、コールバック関数が呼び出されます。
文書構造を説明する
文書を解析するとき、海外駐在員が強調する必要がある問題は、「文書構造の基本的な説明をどのように維持するか?」ということです。
前に述べたように、イベントベースのパーサー自体は構造情報を生成しません。
ただし、タグ構造は XML の重要な機能です。たとえば、要素シーケンス は、<figure><title> とは異なる意味を持ちます。そうは言っても、たとえどちらも「タイトル」という用語を使用していても、本のタイトルと絵のタイトルは互いに何の関係もないと、著者なら誰でも言うでしょう。したがって、イベントベースのパーサーで XML をより効率的に処理するには、独自のスタックまたはリストを使用してドキュメントの構造情報を維持する必要があります。 <br>ドキュメント構造のミラーを作成するには、スクリプトは少なくとも現在の要素の親要素を知っている必要があります。これは、Exapt の API では不可能であり、コンテキスト情報なしで現在の要素のイベントのみを報告します。したがって、独自のスタック構造を構築する必要があります。 <br>スクリプトの例では、先入れ後出し (FILO) スタック構造を使用します。配列を通じて、スタックはすべての開始要素を保存します。開始要素処理関数の場合、現在の要素は <br>array_push() 関数によってスタックの先頭にプッシュされます。同様に、終了要素処理関数は、array_pop() を通じて先頭要素を削除します。 <br>シーケンス <book><title> の場合、スタックは次のように埋められます:
開始要素 book: スタックの最初の要素に "book" を割り当てます ($stack[ 0])。
開始要素 title: スタックの先頭 ($stack[1]) に「title」を割り当てます。
要素タイトルの終了: スタック ($stack[1]) から最上位の要素を削除します。
要素タイトルの終了: スタック ($stack[0]) から最上位の要素を削除します。
PHP3.0 は、$ Depth 変数を通じて要素のネストを手動で制御することにより、この例を実装します。これにより、スクリプトがより複雑に見えます。 PHP4.0 は、スクリプトをより簡潔に見せるために array_pop() 関数と
array_push() 関数を使用します。
データを収集する
各要素に関する情報を収集するには、スクリプトは各要素のイベントを記憶する必要があります。グローバル配列変数 $elements を使用して、ドキュメント
内のさまざまな要素をすべて保存します。配列の項目は要素クラスのインスタンスであり、4 つのプロパティ (クラスの変数) を持ちます。
$count - 要素がドキュメント内で見つかった回数
$chars - 要素内の文字イベントのバイト数
$parents - 親要素
$childs - 子要素
ご覧のとおり、クラス インスタンスを配列に保存するのは簡単です。
注: PHP の特徴は、対応する配列全体を走査するのと同じように、while(list() = each()) ループを通じてクラス構造全体を走査できることです。すべてのクラス変数 (および PHP3.0 を使用する場合はメソッド名) は文字列として出力されます。
要素が見つかったら、その要素がドキュメント内で何回出現したかを追跡するために、対応するカウンターをインクリメントする必要があります。対応する $elements 項目の count 要素も 1 つ増加します。
また、現在の要素がその子要素であることを親要素に知らせる必要があります。したがって、現在の要素の名前は、親要素の $childs 配列内の項目に追加されます。最後に、現在の要素はその親が誰であるかを記憶する必要があります。したがって、親要素は、現在の要素の $parents 配列内の項目に追加されます。
統計の表示
残りのコードは、$elements 配列とそのサブ配列をループして、統計結果を表示します。これは最も単純なネストされたループですが、正しい結果が出力されますが、コードは単純でも特別なスキルも必要ありません。これは、作業を完了するために毎日使用できる単なるループです。
スクリプトの例は、PHP の CGI モードのコマンドラインを通じて呼び出されるように設計されています。そのため、統計結果の出力形式はテキスト形式となります。スクリプトをインターネット
上で使用したい場合は、出力関数を変更して HTML 形式を生成する必要があります。
概要
Exapt は PHP 用の XML パーサーです。イベントベースのパーサーとして、文書の構造的な記述は生成されません。ただし、低レベルのアクセスを提供することにより、リソースの利用効率が向上し、アクセスが高速化されます。
有効性をチェックしないパーサーとして、Expat は XML ドキュメントに関連付けられた DTD を無視しますが、ドキュメントが整形式でない場合はエラー メッセージを表示して停止します。
ドキュメントを処理するためのイベント処理関数を提供します
スタックやツリーなどの独自のイベント構造を構築して、XML 構造化情報マークアップの利点を活用します。
新しい XML プログラムが毎日登場し、PHP の XML サポートは常に強化されています (たとえば、DOM ベースの XML パーサー LibXML のサポートが追加されました)。
PHP と Expat を使用すると、有効かつオープンでプラットフォームに依存しない今後の標準に備えることができます。

現在のページ 1/2 12次のページ

上記では、export_symbol の php XML 解析関数コードを 1/2 ページで紹介しています。export_symbol の内容も含めて、PHP チュートリアルに興味のある友人の参考になれば幸いです。

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