PLISAXA および PLISAXB の SAX イベント構造の説明

イベント構造には、24 個の 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>'
|| 'We should add a <relish> element in future!'
|| '</sandwich>'
|| 'junk';

説明の中の XML テキストという用語は、イベントに渡されるポインターおよび長さに基づいて構成された文字列です。この構造体での出現順に、パーサーは次のイベントを認識することができます。

start_of_document
ドキュメントの構文解析が開始されるときに、1 回発生します。パーサーは、LF (ライン フィード) または NL (新しい行) などの行制御文字を含む、ドキュメント全体のアドレスと長さを渡します。上記の例では、ドキュメントの長さは 305 文字です。
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"/>

ただし、属性値は複数の部分で構成されている場合があります。たとえば、sandwich の例の最初にある type 属性の値は、文字列 baker、単一文字 '、および文字列 s best の 3 つのフラグメントで構成されています。パーサーは、これらのフラグメントを 3 つの別々のイベントとして渡します。複数の文字からなる各文字列は attribute_characters イベントとして渡し、単一文字は attribute_predefined_reference イベントとして渡します。

attribute_predefined_reference
属性値の中で、5 つの定義済みエンティティ参照 &'><、および " に対して発生します。パーサーは、&'><、または " のいずれか 1 つがそれぞれ入った CHAR(1) または WIDECHAR(1) の値を渡します。
attribute_character_reference

属性値の中で、次の形式の数字参照に対して発生します。

&#dd;

または

&#xhh;

ここで、d は 10 進数、h は 16 進数を表します。パーサーは、対応する整数値が含まれた FIXED BIN(31) 値を渡します。

end_of_element
エレメント終了タグまたは空エレメント タグごとに、パーサーがタグの終了不等号かっこを認識したときに 1 回発生します。パーサーは、エレメント名が含まれたテキストのアドレスと長さを渡します。
start_of_CDATA_section
CDATA セクションの開始時に発生します。CDATA セクションは文字列 <![CDATA[ で始まり、文字列 ]] で終わります。本セクションは、エスケープしないと XML マークアップとして認識される文字を含むテキストのブロックをエスケープするために使用されます。パーサーは、開始文字 <![CDATA[ が含まれたテキストのアドレスと長さを渡します。パーサーは、これらの区切り文字間にある CDATA セクションの内容を、単一の 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>

エレメントの内容に参照や他のエレメントが含まれている場合、内容全体は複数のセグメントで構成されている場合があります。

たとえば、上記の例の meat エレメントの内容は、文字列 Ham 、文字 &、および文字列 turkey で構成されます。最初の文字列フラグメントには後続空白文字があり、2 番目の文字列フラグメントには先頭空白文字があります。パーサーは、これらの 3 つの内容のフラグメントを別々のイベントとして渡します。文字列の内容のフラグメント (Ham および turkey) は content_characters イベントとして渡され、単一の & 文字は content_predefined_reference イベントとして渡されます。また、パーサーは content_characters イベントを使用して CDATA セクションのテキストをアプリケーションに渡します。

content_predefined_reference
エレメント内容の中で、定義済みエンティティ参照 &'><、および " に対して発生します。パーサーは、&'><、または " のいずれか 1 つがそれぞれ入った CHAR(1) または WIDECHAR(1) の値を渡します。
content_character_reference

エレメント内容の中で、次の形式の数字参照に対して発生します。

&#dd;

または

&#xhh;

ここで、d は 10 進数、h は 16 進数を表します。パーサーは、対応する整数値が含まれた FIXED BIN(31) 値を渡します。

processing_instruction
処理命令 (Processing Instruction; PI) を使用すると、XML ドキュメントにアプリケーション用の特別な命令を含めることができます。このイベントは、パーサーが PI 開始文字シーケンス <? に続く名前を認識したときに発生します。また、このイベントは、PI ターゲットに続く PI 終了文字シーケンス ?> までのデータ (?> 自体は含まない) も対象とします。データの末尾にある空白文字は含まれますが、先頭にある空白文字は含まれません。パーサーは、ターゲットが含まれるテキスト (上記の例では spread) のアドレスと長さ、およびデータが入ったテキスト (上記の例では please use real mayonnaise) のアドレスと長さを渡します。
comment
XML ドキュメント内のコメントに対して発生します。パーサーは、開始および終了コメント区切り文字 (それぞれ <!---->) の間にあるテキストのアドレスと長さを渡します。上記の例では、This document is just an example だけがコメントのテキストです。
unknown_attribute_reference
属性値の中で、定義済みエンティティ参照 (イベント attribute_predefined_reference の説明で示したもの) 以外のエンティティ参照に対して発生します。パーサーは、エンティティ名が含まれたテキストのアドレスと長さを渡します。
unknown_content_reference
エレメント内容の中で、定義済みエンティティ参照 (イベント content_predefined_reference の説明で示したもの) 以外のエンティティ参照に対して発生します。パーサーは、エンティティ名が含まれたテキストのアドレスと長さを渡します。
start_of_prefix_mapping
このイベントは、現在は生成されません。
end_of_prefix_mapping
このイベントは、現在は生成されません。
exception
XML ドキュメントの処理中にエラーを検出すると、パーサーはこのイベントを生成します。