PLISAXC の SAX イベント構造の説明

イベント構造には、19 の ENTRY 変数があります。これらの変数は、各種イベントでパーサーによって呼び出される機能をポイントします。

このトピックに含まれている各イベントの説明では、次の XML ドキュメントの例を参照します。
xmlDocument =
   '<?xml version="1.0" standalone="yes"?>'
|| '<!--This document is just an example-->'
|| '<sandwich>'
|| '<bread type="baker&quot;s best"/>'
|| '<?spread please use real mayonnaise ?>'
|| '<meat>Ham &amp; turkey</meat>'
|| '<filling>Cheese, lettuce, tomato, etc.</filling>'
|| '<![CDATA[We should add a <relish> element in future!]]>'
|| '</sandwich>'
|| 'junk';

説明で使われている XML テキスト という表現は、イベントに渡されるポインターと長さに基づいて構成される文字列を表します。パーサーはこれらのイベントを構造内で現れる順序で認識します。

start_of_document
ドキュメント解析の始めに 1 回発生します。パーサーは、このイベントにはパラメーターを渡しません (ユーザー トークンを除く)。
version_information
バージョン情報のオプションの XML 宣言の中で発生します。パーサーは、バージョン値 (上記の例では"1.0") を含んでいるテキストのアドレスと長さを渡します。
encoding_declaration
オプションの符号化宣言の XML 宣言の中で発生します。パーサーは、符号化の値を含んでいるテキストのアドレスと長さを渡します。
standalone_declaration
オプションのスタンドアロン宣言の XML 宣言の中で発生します。パーサーは、スタンドアロン値 (上記の例では「yes」) を含んでいるテキストのアドレスと長さを渡します。
document_type_declaration
パーサーがドキュメント タイプ宣言を検出したとき発生します。ドキュメント タイプ宣言は、文字シーケンス <!DOCTYPE" で始まり > 文字で終わります。この間に含まれる内容には、きわめて複雑な文法規則がともないます。

パーサーは、宣言全体を含んでいるテキストのアドレスと長さを渡します。この中には、開始と終了の文字シーケンスも含まれます。これは、XML テキストが区切り文字を含む唯一のイベントです。上記の例には、ドキュメント タイプ宣言はありません。

end_of_document
ドキュメントの解析が完了したとき 1 回発生します。パーサーは、このイベントにはパラメーターを渡しません (ユーザー トークンを除く)。
start_of_element
それぞれの要素開始タグまたは空の要素タグで 1 回発生します。パーサーは、要素名および該当するネームスペース情報を含んでいるテキストのアドレスと長さを渡します。上記の例では、解析中の最初の start_of_element イベントに sandwich という文字列が含まれています。
attribute_name
有効な名前を認識すると、要素開始タグまたは空の要素タグの各属性で発生します。パーサーは、属性名および該当するネームスペース情報を含んでいるテキストのアドレスと長さを渡します。上記の例では、唯一の属性名は type です。
attribute_characters

属性値の各フラグメントで発生します。パーサーは、そのフラグメントを含んでいるテキストのアドレスと長さを渡します。通常、属性値は複数行に分かれる場合でも 1 つの文字列のみを含みます。

<element attribute="This attribute value is
split across two lines"/>
end_of_element
パーサーがタグの終わり山括弧を認識するたびに、それぞれの要素終了タグまたは空の要素タグで 1 回発生します。パーサーは、要素名および該当するネームスペース情報を含んでいるテキストのアドレスと長さを渡します。
start_of_CDATA_section
CDATA セクションの始まりで発生します。CDATA セクションは <![CDATA[ 文字列で始まり、]] 文字列で終わります。これは、XML マークアップとして認識される文字を含むテキストのブロックをエスケープするために使用します。パーサーは、このイベントにはパラメーターを渡しません (ユーザー トークンを除く)。

このイベントの後で、パーサーはこれらの区切り文字間にある CDATA セクションの内容を、1 つまたは複数の content-characters イベントとして渡します。上記の例では、content-characters イベントに We should add a <relish> element in future! というテキストが渡されています。

end_of_CDATA_section
このイベントは、パーサーが CDATA セクションの末尾を認識すると発生します。パーサーは、このイベントにはパラメーターを渡しません (ユーザー トークンを除く)。
content_characters

このイベントは、XML ドキュメントの本体を表します。これは、要素の開始と終了のタグ間にある文字データです。パーサーは、このデータを含んでいるテキストのアドレスと長さを渡します。このデータは通常、複数の行に分かれていても 1 つの文字列のみを含んでいます。

<element1>This character content is
split across two lines"</element1>

パーサーは、次のイベントによって内容の一部を構成する他の文字が提供されるかどうかを示す、フラグ バイトも渡します。開始と終了のタグ間に多くのデータがあるときが、これに該当します。

さらにパーサーは content_characters イベントを使用して CDATA セクションのテキストをアプリケーションに渡します。

processing_instruction
Processing instruction (PI) により、XML ドキュメントにアプリケーションの特殊な命令を含めることができます。このイベントは、パーサーが PI 開始文字シーケンス <? の後の名前を認識すると発生します。さらに、この PI ターゲットの後から PI 終了文字シーケンス ?> までのデータ (終了文字は含まない) もこのイベントの対象になります。データの先頭でなく末尾にある余白文字も対象に含まれます。上記例では、パーサーはターゲット spread を含んでいるテキストのアドレスと長さと、データ please use real mayonnaise を含んでいるテキストのアドレスと長さを渡します。
comment
XML ドキュメントのすべてのコメントに発生します。パーサーは、コメントの開始 <!-- と終了 --> の区切り文字間にあるテキストのアドレスと長さを渡します。上記例では、唯一のコメント テキストは This document is just an example です。
namespace_declare
XML ドキュメントのすべてのネームスペース宣言に発生します。パーサーは、ネームスペース プレフィックス (もしあれば) のアドレスと長さ、およびネームスペース URI のアドレスと長さを渡します。ネームスペース プレフィックスがない場合、渡される長さはゼロでアドレスの値は使用されません。PLIXSAXA と PLISAXB ビルトインには、対応するイベントはありません。
end_of_input
このイベントは、パーサーが現在の入力バッファーの終わりに達すると発生します。パーサーは、(BYVALUE ユーザー トークンとともに) 2 つの BYADDR パラメーター、つまり次のバッファーのアドレスと長さを渡し、処理されるようにします。BYADDR パラメーターを持つイベントは、このイベントとコンテンツ文字イベントに限られますが、このイベントは呼び出されたイベントによって変更されるパラメーターを持つ唯一のイベントです。PLIXSAXA と PLISAXB ビルトインには対応するイベントはなく、このイベントが PLISAXC による任意サイズの XML ドキュメントの解析を許可するイベントです。
unresolved_reference
このイベントは、XML ドキュメントですべての未解決リファレンスに発生します。パーサーは、未解決リファレンスのアドレスと長さを渡します。
unknown_attribute_reference
定義済みのエンティティ リファレンス以外のエンティティ リファレンスの属性値の中で発生し、イベント attribute_predefined_reference にリストされます。パーサーは、エンティティ名を含んでいるテキストのアドレスと長さを渡します。
exception
パーサーは、XML ドキュメントを処理するエラーを検出したとき、このイベントを生成します。