リリースはありません
明白なことについての言及:XML_Parse、XML_ParseBuffer、XML_GetBufferの3つの解析関数は(ハンドラ関数を呼ばなかった) 異なるパーサインスタンス上で動作する限りハンドラ関数内から呼び出してはなりません。 例えば、XML_ExternalEntityParserCreateによって生成されたパーサに適用する場合、 XML_ExternalEntityRefHandler内から解析関数を呼ぶことはOKです。
注:これらの関数で渡されるlen引数は、 追加されたバッファの長さと、前のバッファの未処理部分が整数値の最大を超えた場合に 数値のオーバフローの条件が生成できるようにする必要があるため、 整数値の最大値よりかなり小さい必要があります。 末尾がそのバッファの一部ではないXMLトークンの一部の場合、バッファの末尾に入力したデータは 未処理のままとなります。
- for (;;) {
- int bytes_read;
- void *buff = XML_GetBuffer(p, BUFF_SIZE);
- if (buff == NULL) {
- /* handle error */
- }
- bytes_read = read(docfd, buff, BUFF_SIZE);
- if (bytes_read < 0) {
- /* handle error */
- }
- if (! XML_ParseBuffer(p, bytes_read, bytes_read == 0)) {
- /* handle parse error */
- }
- if (bytes_read == 0)
- break;
- }
ハンドラ関数は一般的には解析をする前に設定され、そのままにされますが、 アプリケーションは解析中に解析イベントに対するハンドラ関数を設定あるいは変更することができます。 例えば、アプリケーションはpara要素から派生していないすべてのテキストを無視することもできます。 これを行うことができる方法の1つはpara開始タグが見つかった時に 文字ハンドラ関数を設定し、対応する終了タグのときにハンドラ関数を設定解除することです。
ハンドラ関数は適切なハンドラ関数の設定関数へNULLポインタを渡すことで解除できます。 ハンドラ関数の設定関数は戻り値はありません。
ハンドラ関数はXML_Char型の配列で文字列を受け取ります。 この型は条件に応じてchar、wchar_tあるいはunsigned short のいずれかでexpat.hにて定義されています。 前者はUTF-8エンコーディングを意味し、後者の2つはUTF-16エンコーディングを意味します。 XMLドキュメントの元のエンコーディングに依存しないこの形式で受け取ることに注意してください。
- typedef void
- (XMLCALL *XML_ElementDeclHandler)(void *userData,
- const XML_Char *name,
- XML_Content *model);
- enum XML_Content_Type {
- XML_CTYPE_EMPTY = 1,
- XML_CTYPE_ANY,
- XML_CTYPE_MIXED,
- XML_CTYPE_NAME,
- XML_CTYPE_CHOICE,
- XML_CTYPE_SEQ
- };
- enum XML_Content_Quant {
- XML_CQUANT_NONE,
- XML_CQUANT_OPT,
- XML_CQUANT_REP,
- XML_CQUANT_PLUS
- };
- typedef struct XML_cp XML_Content;
- struct XML_cp {
- enum XML_Content_Type type;
- enum XML_Content_Quant quant;
- const XML_Char * name;
- unsigned int numchildren;
- XML_Content * children;
- };
これらは、解析関数がXML_STATUS_ERROR(解析エラーが発生)を返す場合に 呼び出したい関数です。位置の報告関数はエラーの外側で便利です。 報告された位置は、現在のイベント(あるいは解析関数がXML_STATUS_ERRORを 返す原因になったエラー)が生成された文字シーケンスの最初のバイト位置(元のXMLドキュメント あるいはエンティティのエンコーディング)です。 例外は、XMLドキュメントのプロローグ内の宣言によって引き起こされたコールバック関数です。 この場合、それらは報告された位置は適切なマークアップ内のどこかにあると期待します。 しかし、必ずしも他のイベントと同じ意味があるわけではありません。
位置の報告関数はDTDの外でのみ正確です。 すなわち、DTD宣言のハンドラ関数内から呼び出されたとき、それらは通常偽りの情報を返します。
このセクション内の関数はパーサからの状態情報を取得するか、 パーサのオプションを動的に設定するために使用されるかのいずれかです。
- typedef struct {
- XML_Index nameStart; /* Offset to beginning of the attribute name. */
- XML_Index nameEnd; /* Offset after the attribute name's last byte. */
- XML_Index valueStart; /* Offset to beginning of the attribute value. */
- XML_Index valueEnd; /* Offset after the attribute value's last byte. */
- } XML_AttrInfo;
- enum XML_FeatureEnum {
- XML_FEATURE_END = 0,
- XML_FEATURE_UNICODE,
- XML_FEATURE_UNICODE_WCHAR_T,
- XML_FEATURE_DTD,
- XML_FEATURE_CONTEXT_BYTES,
- XML_FEATURE_MIN_SIZE,
- XML_FEATURE_SIZEOF_XML_CHAR,
- XML_FEATURE_SIZEOF_XML_LCHAR,
- XML_FEATURE_NS,
- XML_FEATURE_LARGE_SIZE
- };
- typedef struct {
- enum XML_FeatureEnum feature;
- XML_LChar *name;
- long int value;
- } XML_Feature;
以下の関数は外部コードがXML_Parserが使用するために設計されている
メモリアロケータを共有することを許します。
これはアプリケーションコード、または何重にも階層化されたアプリケーションによって
生成されたパーサオブジェクトと対話する
サードパーティ製のライブラリにとって特に便利です。
異なるC標準ライブラリ(少なくともWindows上で発生する可能性があります)
を使用するDLLを使用する場合に不可欠です。
※このページは、Expat2.1.0内のdoc\reference.html内のExpat Referenceを元に作成しました。
[ページ情報]
更新日時: 2012-08-19 10:02:34, 更新者: daruma_kyo
[権限]
表示:無制限, 編集:ログインユーザ, 削除/設定:メンバー