XML (eXtensible Markup Language) は、Web
における構造化された ドキュメント交換用のデータフォーマットです。XML は、World Wide Web
consortium (W3C) で規定された規格です。XML に関する情報およ び関連する技術は、
http://www.w3.org/XML/
で参照することができます。
このPHP拡張機能は、James Clark氏の
expat
のサポートをPHPに付加します。 このツールキットは、XML ドキュメントの構文解析をしますが、
検証は行いません。3種類のソース
文字エンコーディング
、
US-ASCII
,
ISO-8859-1
,
UTF-8
がPHPでサポートされます。
UTF-16
はサポートさ れません。
この拡張モジュールは、
XML
パーサの作成
を行い、異なった XML イベントに関して
ハンドラ
を定義します。各XMLパーサーには、設定可能な小数の
パラメータ
もあります。
この拡張機能は、
expat
を使用します。こ れは、
http://www.jclark.com/xml/
にあります。 expatに付属のMakefileは、デフォルトでライブラリを構築しません。こ
れを行うmakeルールを次のように指定できます。
libexpat.a: $(OBJS) ar -rc $@ $(OBJS) ranlib $@ |
付属しているexpatライブラリを用いて以下の関数はデフォルトで有効となっ
ています。
--disable-xml
を指定してXMLサポート を無効にすることができます。Apache 1.3.9以降でモジュールとしてPHPを
コンパイルする場合、PHPは、Apacheから自動的に付属する
expat
ライブラリを使用します。 付属するexpatライブラリを使用したくない場合には、
--with-expat-dir=DIR
を指定してPHP のconfigureを実行して下さい。ただし、DIRは、expatをインストールした
ベースディレクトリです。
Windows版の
PHP
にはこの拡張モジュールのサポートが組み込まれています。これらの関数を使用するために拡張モジュールを追加でロードする必要はありません。
これらの定数は、この拡張モジュールで定義されており、
この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー
ドされるかのどちらかの場合のみ使用可能です。
XML イベントハンドラは次のように定義されます。
表 1サポートされる XML ハンドラ
ハンドラ設定用の PHP 関数 | イベントの説明 |
---|---|
xml_set_element_handler() | 要素イベントは、XML パーサーが開始または終了タグに出会うたび に発行されます。開始タグと終了タグについて別のハンドラがあり ます。 |
xml_set_character_data_handler() | 文字データは、タグの間の空白を含めて XML ドキュメントにおけ るほぼ全ての非マークアップ部分の内容です。XML パーサーは、 空白を加えたり削除したりしないことに注意して下さい。空白が 意味を有するかどうかを決めるのは、アプリケーション側の責任 です。 |
xml_set_processing_instruction_handler() | PHP プログラマは、既に処理用命令 (PI) に既に慣れているに違 いありません。 ?php ? は処理用命令であり、この場合、 php は "PI ターゲット"と呼ばれます。 これらの処理はアプリケーション依存ですが、全ての PI ターゲッ トが "XML" から始まることだけは、規定されています。 |
xml_set_default_handler() | 別のハンドラでしないことをデフォルトのハンドラで行います。 XML およびドキュメント型の宣言のようなことをデフォルトハンドラで 行います。 |
xml_set_unparsed_entity_decl_handler() | このハンドラは、処理されない (NDATA) エンティティの宣言用に コールされます。 |
xml_set_notation_decl_handler() | このハンドラは、表記の宣言用にコールされます。 |
xml_set_external_entity_ref_handler() | このハンドラは、XML パーサーが外部処理された通常のエンティティ への参照を見つけた際にコールされます。これは、例えば、ファ イルまたは URL への参照とすることが可能です。例としては、 外部エンティティ の例 を参照下さい。 |
要素ハンドラ関数は、その要素に
大文字小文字を変換する (case-folded)
の名前をつけることができます。 大文字変換(case-folding) は、XML標準により
"大文字でないものは等 価な大文字に置換される一連の文字に適用されるプロセス" として定義
されています。言い替えると、XML に関しては単に大文字変換は大文字 にすることを意味します。
デフォルトで、ハンドラ関数に渡される全ての要素名は、大文字変換さ
れます。この動作は、
xml_parser_get_option()
および
xml_parser_set_option()
関数でXMLパーサー 毎にそれぞれ問い合わせ、制御することが可能です。
(
xml_parse()
により返されるものとして) XMLエラーコードとして次のような定数が定義されています。:
XML_ERROR_NONE |
XML_ERROR_NO_MEMORY |
XML_ERROR_SYNTAX |
XML_ERROR_NO_ELEMENTS |
XML_ERROR_INVALID_TOKEN |
XML_ERROR_UNCLOSED_TOKEN |
XML_ERROR_PARTIAL_CHAR |
XML_ERROR_TAG_MISMATCH |
XML_ERROR_DUPLICATE_ATTRIBUTE |
XML_ERROR_JUNK_AFTER_DOC_ELEMENT |
XML_ERROR_PARAM_ENTITY_REF |
XML_ERROR_UNDEFINED_ENTITY |
XML_ERROR_RECURSIVE_ENTITY_REF |
XML_ERROR_ASYNC_ENTITY |
XML_ERROR_BAD_CHAR_REF |
XML_ERROR_BINARY_ENTITY_REF |
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF |
XML_ERROR_MISPLACED_XML_PI |
XML_ERROR_UNKNOWN_ENCODING |
XML_ERROR_INCORRECT_ENCODING |
XML_ERROR_UNCLOSED_CDATA_SECTION |
XML_ERROR_EXTERNAL_ENTITY_HANDLING |
PHPのXML拡張機能は、異なった
文字エンコーディング
を通じて
Unicode
文字セットをサポートします。
ソースエンコーディング
および
ターゲットエンコーディング
という2種類の文字エンコーディングがあります。 PHP におけるドキュメントの内部表現は、常に
UTF-8
でエンコードされます。
ソースエンコーディングは、XMLドキュメントが
構文解析
された際に行わ れます。
XML パーサの
作成
を行う際に、ソースエンコードを指定することができます。 (このエンコーディングは、その XML
パーサーが存在する間、後で変更す ることはできません)サポートされるソースエンコーディングは、
ISO-8859-1
,
US-ASCII
,
UTF-8
です。前の二つは、シングルバイトエンコー ディングです。これは、各文字がシングルバイトで表現されることを意
味します。
UTF-8
は、1から4バイトの可変ビット 数(最大21ビット)で構成された文字をエンコードすることが可能です。 PHP
で用いられるデフォルトのソースエンコーディングは、
ISO-8859-1
です。
ターゲットエンコーディングは、PHPがデータをXMLハンドラ関数に
渡す時に行われます。あるXMLパーサが作成された際、ターゲットエン
コーディングは、ソースエンコーディングと同様に設定されます。
しかし、これは、いつでも変更可能です。ターゲットエンコーディング
は、タグ名と同様に文字データに作用し、命令を処理します。
XML パーサがソースエンコーディングが表現できる範囲の外側の文字に
出会った場合、エラーが返されます。
解釈するXMLドキュメントにおいてPHPが文字に出会った際に、選択した
ターゲットエンコーディングで表現できない文字に出会った場合、問題 の文字は "降格"
されます。現在、このことはこのような文字が疑問符 で置換されることを意味します。
以下にXMLドキュメントを処理するPHPスクリプトの例をいくつか示しま
す。
この最初の例は、あるドキュメント中のstart エレメントの構造をイン
デントを付けて表示します。
|
この例は、XML コードに焦点を当てます。この例は、他のドキュメント
をインクルードし処理するための外部エンティティリファレンスのハン
ドラの使用法およびPIの処理方法、PIが含むコードに関する"信頼度" を定義する手段を説明します。
この例で使用される XML ドキュメントは、例題ファイル (
xmltest.xml
および
xmltest2.xml
) にあります。
|
|
This file is included from
xmltest.xml
: