![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0 |
#include <SFXXMLDefaultHandler.hpp>
class SFXXMLDefaultHandler;
SFMTYPEDEFCLASS(SFXXMLDefaultHandler)
SAX パーサー(SFXXMLSAXParser)では、XML 文書を先頭から順に読み込み、 要素や CDATA セクションの開始や終了を検出する度にイベントを発生します。それらのイベントは、SFXXMLDefaultHandler クラスを継承するクラスの然るべきハンドラ関数に通知されて処理されます。
イベントの順序は、XML 文書に含まれる情報の内容と一致します。たとえば、ある要素の内容 ( 文字データ、処理命令、サブ要素など ) は、StartElement イベントと EndElement イベントの間に順番に並べられます。
SAX パーサー(SFXXMLSAXParser)を利用するには、SFXXMLDefaultHandler クラスを 継承するクラスを実装して、 SFXXMLSAXParser::SetDefaultHandler 関数を使って SAX パーサー(SFXXMLSAXParser)に登録する必要があります。
SAX パーサー( SFXXMLSAXParser) には、DOM パーサー( SFXXMLDOMParser) よりも少ないメモリで速く解析できるというメリットがあります。
例 794. SAX パーサーのハンドラ クラスの定義と実装
// SAX パーサーのイベントハンドラ クラス class MyXMLHandler : public SFXXMLDefaultHandler { public: explicit MyXMLHandler(Void); virtual ~MyXMLHandler(Void); // 各ハンドラ // データの内容を取得するハンドラ virtual Void Characters(SFXAnsiStringConstRef string, BoolConst cdataSection = true); virtual Void EndDocument(Void); virtual Void EndElement(SFXAnsiStringConstRef uri = SFXAnsiString::EmptyInstance(), SFXAnsiStringConstRef localname = SFXAnsiString::EmptyInstance(), SFXAnsiStringConstRef qname = SFXAnsiString::EmptyInstance()); virtual Void StartDocument(Void); virtual Void StartElement(SFXAnsiStringConstRef uri,SFXAnsiStringConstRef localname, SFXAnsiStringConstRef qname, SFXXMLGrammar::XMLAttrListConstRef attrList); virtual Void IgnorableWhitespace(SFXAnsiStringConstRef string); virtual Void ProcessingInstruction(SFXAnsiStringConstRef target, SFXAnsiStringConstRef data); virtual Void EndPrefixMapping(SFXAnsiStringConstRef prefix); virtual Void StartPrefixMapping(SFXAnsiStringConstRef prefix, SFXAnsiStringConstRef uri); // 解析用のハンドラ virtual Void Comment(SFXAnsiStringConstRef string); virtual Void EndCDATA(Void); virtual Void EndDTD(Void); virtual Void EndEntity(SFXAnsiStringConstRef name); virtual Void StartCDATA(Void); virtual Void StartDTD(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId); virtual Void StartEntity(SFXAnsiStringConstRef name); // DTD 宣言に関するハンドラ virtual Void NotationDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId); virtual Void UnparsedEntityDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId, SFXAnsiStringConstRef notationName); // 宣言の通知を取得するハンドラ virtual Void ElementDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef model); virtual Void AttributeDecl(SFXAnsiStringConstRef ename, SFXAnsiStringConstRef aname, SFXAnsiStringConstRef type, SFXAnsiStringConstRef valuedefault, SFXAnsiStringConstRef value); virtual Void InternalEntityDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef value); virtual Void ExternalEntityDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId); // エラーの通知を取得するハンドラ virtual Void ErrorReport(SFCErrorConst error, SFXAnsiStringConstRef errInfo); }; // コンストラクタ MyXMLHandler::MyXMLHandler(Void) { return; } // デストラクタ MyXMLHandler::~MyXMLHandler(Void) { return; } // 文書の開始通知を受け取るハンドラ Void MyXMLHandler::StartDocument(Void) { TRACE("document start"); } // 文書の終了通知を受け取るハンドラ Void MyXMLHandler::EndDocument(Void) { TRACE("document end"); } // 要素の開始通知を受け取るハンドラ Void MyXMLHandler::StartElement(SFXAnsiStringConstRef uri, SFXAnsiStringConstRef localname, SFXAnsiStringConstRef qname, SFXXMLGrammar::XMLAttrListConstRef attrList) { // 要素名を表示する TRACE("element: %s start", qname.GetCString()); // 要素の最初の属性に対応する列挙子を取得する SFXXMLGrammar::XMLAttrList::Enumerator etor = attrList.GetFirstEnumerator(); // すべての属性の名前と値を表示する while (etor.HasNext()) { SFXXMLGrammar::LPXMLATTR attr = etor.GetNext(); // 次の属性を取得する TRACE("attrname: %s", attr->_attName.GetCString()); // 属性の名前を表示する TRACE("attrvalue: %s", attr->_value.GetCString()); // 属性の値を表示する } } // 要素の終了通知を受け取るハンドラ Void MyXMLHandler::EndElement(SFXAnsiStringConstRef uri, SFXAnsiStringConstRef localname, SFXAnsiStringConstRef qname) { TRACE("element: %s end", qname.GetCString()); } // 文字データの通知を受け取るハンドラ Void MyXMLHandler::Characters(SFXAnsiStringConstRef string, BoolConst /*cdataSection*/) { TRACE("text: %s", string.GetCString()); return; } // ↓以下は空のハンドラ ( イベントを無視する場合も定義する ) // 不要な空白文字の通知を受け取るハンドラ Void MyXMLHandler::IgnorableWhitespace(SFXAnsiStringConstRef string) { return; } // 処理命令の通知を受け取るハンドラ Void MyXMLHandler::ProcessingInstruction(SFXAnsiStringConstRef target, SFXAnsiStringConstRef data) { return; } // 接頭辞と URI 名前空間マッピングのスコープの終了通知を受け取るハンドラ Void MyXMLHandler::EndPrefixMapping(SFXAnsiStringConstRef prefix) { return; } // 接頭辞と URI 名前空間マッピングのスコープの開始通知を受け取るハンドラ Void MyXMLHandler::StartPrefixMapping(SFXAnsiStringConstRef prefix, SFXAnsiStringConstRef uri) { return; } // コメントの通知を受け取るハンドラ Void MyXMLHandler::Comment(SFXAnsiStringConstRef string) { return; } // CDATA セクションの終了通知を受け取るハンドラ Void MyXMLHandler::EndCDATA(Void) { return; } // DTD 宣言の終了通知を受け取るハンドラ Void MyXMLHandler::EndDTD(Void) { return; } // エンティティの終了通知を受け取るハンドラ Void MyXMLHandler::EndEntity(SFXAnsiStringConstRef name) { return; } // CDATA セクションの開始通知を受け取るハンドラ Void MyXMLHandler::StartCDATA(Void) { return; } // DTD 宣言の開始通知を受け取るハンドラ Void MyXMLHandler::StartDTD(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId) { return; } // エンティティの開始通知を受け取るハンドラ Void MyXMLHandler::StartEntity(SFXAnsiStringConstRef name) { return; } // 記法宣言の通知を受け取るハンドラ Void MyXMLHandler::NotationDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId) { return; } // 処理命令の通知を受け取るハンドラ Void MyXMLHandler::UnparsedEntityDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId, SFXAnsiStringConstRef notationName) { return; } // 要素型宣言の通知を受け取るハンドラ Void MyXMLHandler::ElementDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef model) { return; } // ATTLIST 宣言の通知を受け取るハンドラ Void MyXMLHandler::AttributeDecl(SFXAnsiStringConstRef ename, SFXAnsiStringConstRef aname, SFXAnsiStringConstRef type, SFXAnsiStringConstRef mode, SFXAnsiStringConstRef value) { return; } // 内部エンティティ宣言の通知を受け取るハンドラ Void MyXMLHandler::InternalEntityDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef value) { return; } // 外部エンティティ宣言の通知を受け取るハンドラ Void MyXMLHandler::ExternalEntityDecl(SFXAnsiStringConstRef name, SFXAnsiStringConstRef publicId, SFXAnsiStringConstRef systemId) { return; } // エラーの通知を受け取るハンドラ Void MyXMLHandler::ErrorReport(SFCErrorConst error, SFXAnsiStringConstRef errInfo) { return; }
| コンストラクタ/デストラクタ |
|---|
|
SFXXMLDefaultHandler( Void ) SFXXMLDefaultHandler クラスのコンストラクタです。
|
|
~SFXXMLDefaultHandler( Void ) SFXXMLDefaultHandler クラスのデストラクタです。
|
[ public, explicit ] SFXXMLDefaultHandler(Void);
[ public, virtual ] virtual ~SFXXMLDefaultHandler(Void);
[ public, virtual ] Void AttributeDecl( SFXAnsiStringConstRef ename // 関連要素名 SFXAnsiStringConstRef aname // 属性の名前 SFXAnsiStringConstRef type // 属性型を示す文字列 SFXAnsiStringConstRef valuedefault // 属性のデフォルト値を示す文字列 SFXAnsiStringConstRef value // 属性のデフォルトモード ( #IMPLIED、#REQUIRED、または #FIXED ) を示す文字列 );
[ public, virtual ] Void Characters( SFXAnsiStringConstRef string // XML 文書 BoolConst cdataSection = true // CDATASection かどうか );
XML 文書です。
SAX パーサーの場合、常に true となります。
SAX パーサーは、SFXXMLDefaultHandler::Characters 関数を呼び出して、文字データを通知します。
[ public, virtual ] Void Comment( SFXAnsiStringConstRef string // コメントに含まれる文字を格納する配列 );
外部 DTD サブセットも含め、文書の内外に存在するコメントの処理に使います。
[ public, virtual ] Void ElementDecl( SFXAnsiStringConstRef name // 要素名 SFXAnsiStringConstRef model // 正規化された内容モデル ( content model ) );
![]() |
正規化された内容モデル(Normalized Content Model): |
|---|---|
パラメータ エンティティは展開され、余分な空白文字は削除された内容モデルのことです。 | |
[ public, virtual ] Void EndCDATA(Void);
[ public, virtual ] Void EndDTD(Void);
文書に DOCTYPE 宣言が含まれていない場合は呼び出されません。
[ public, virtual ] Void EndDocument(Void);
[ public, virtual ] Void EndElement( SFXAnsiStringConstRef uri = SFXAnsiString::EmptyInstance() // 名前空間処理が行われる場合 URI の値 SFXAnsiStringConstRef localname = SFXAnsiString::EmptyInstance() // 接頭辞を含まないローカル名 SFXAnsiStringConstRef qname = SFXAnsiString::EmptyInstance() // 接頭辞を持つ XML 1.0 修飾名 );
SAX パーサーは、XML 文書内の各要素の終わりで、SFXXMLDefaultHandler::EndElement 関数を呼び出します。各 EndElement イベントには対応する StartElement イベントがあります。要素が空である場合も同様です。
[ public, virtual ] Void EndEntity( SFXAnsiStringConstRef name // エンティティの名前 );
[ public, virtual ] Void EndPrefixMapping( SFXAnsiStringConstRef prefix // マッピングされていた名前空間接頭辞 );
[ public, virtual ] Void ErrorReport( SFCErrorConst error // エラーコード SFXAnsiStringConstRef errInfo // 具体的なエラーメッセージ );
XML 構文解析エラー、DTD、スキーマの妥当性の問題、メモリ不足などのエラー通知を受け取ります。
[ public, virtual ] Void ExternalEntityDecl( SFXAnsiStringConstRef name // エンティティの名前 SFXAnsiStringConstRef publicId // エンティティの公開識別子 SFXAnsiStringConstRef systemId // エンティティのシステム識別子 );
[ public, virtual ] Void IgnorableWhitespace( SFXAnsiStringConstRef string // XML 文書の文字 );
インデントを解析する場合、SFXXMLDefaultHandler::IgnorableWhitespace 関数を使って、要素に含まれる余分な空白文字を通知します。
[ public, virtual ] Void InternalEntityDecl( SFXAnsiStringConstRef name // エンティティの名前 SFXAnsiStringConstRef value // エンティティのテキスト );
[ public, virtual ] Void NotationDecl( SFXAnsiStringConstRef name // 記法名 SFXAnsiStringConstRef publicId // 記法の公開識別子 SFXAnsiStringConstRef systemId // 記法のシステム識別子 );
[ public, virtual ] Void ProcessingInstruction( SFXAnsiStringConstRef target // 処理命令のターゲット SFXAnsiStringConstRef data // 処理命令を受けるデータ );
[ public, virtual ] Void StartCDATA(Void);
CDATA セクションは、正規の characters イベントを介して通知されます。このイベントは境界の通知だけに使われます。
[ public, virtual ] Void StartDTD( SFXAnsiStringConstRef name // 文書型名 SFXAnsiStringConstRef publicId // 宣言された外部 DTD サブセットの公開識別子 SFXAnsiStringConstRef systemId // 宣言された外部 DTD サブセットのシステム識別子 );
文書に DOCTYPE 宣言が含まれていない場合は呼び出されません。 StartDTD、EndDTD イベントは、 StartDocument、EndDocument イベント内の最初の StartElement イベントの前に出現します。
[ public, virtual ] Void StartDocument(Void);
[ public, virtual ] Void StartElement( SFXAnsiStringConstRef uri // 要素の名前空間 URI SFXAnsiStringConstRef localname // 接頭辞を含まないローカル名 SFXAnsiStringConstRef qname // 接頭辞付きの修飾名 SFXXMLGrammar::XMLAttrListConstRef attrList // 要素に付加された属性リスト );
SAX パーサーは XML 文書内の各要素の前で、SFXXMLDefaultHandler::StartElement 関数を呼び出します。各 StartElement イベントには対応する EndElement イベントがあります。要素が空である場合も同様です。
対応する EndElement イベントの前に、要素のコンテンツ全部が順番に通知されます。
[ public, virtual ] Void StartEntity( SFXAnsiStringConstRef name // エンティティの名前 );
パラメータ エンティティの場合、エンティティの名前は「 % 」で始まります。外部 DTD サブセットの場合は、 "[dtd]" で始まります。
エンティティは、正規化された名前で通知されます。
[ public, virtual ] Void StartPrefixMapping( SFXAnsiStringConstRef prefix // 名前空間接頭辞 SFXAnsiStringConstRef uri // 名前空間接頭辞のマップ先名前空間 URI );
[ public, virtual ] Void UnparsedEntityDecl( SFXAnsiStringConstRef name // エンティティの名前 SFXAnsiStringConstRef publicId // エンティティの公開識別子 SFXAnsiStringConstRef systemId // エンティティのシステム識別子 SFXAnsiStringConstRef notationName // 記法名 );
記法名は、NotationDecl イベントによって通知される記法に一致します。あとで参照できるようにエンティティを記録するアプリケーションと、記録しないアプリケーションがあります。
解析対象外エンティティは属性値として表示されることもあります。
|
Copyright (C) 2002 - 2008 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|