まず最初に、私はコンピューターの標準が大好きであることを認めなければなりません。もし誰もが業界の標準に従えば、インターネットはより良いメディアになるでしょう。標準化されたデータ交換フォーマットの使用により、オープンでプラットフォームに依存しないコンピューティング モデルが実現可能になります。それが私が 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 の重要な機能です。たとえば、要素シーケンス