前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0
SFXXMLDefaultHandler
[XML] SAX パーサーのイベントハンドラを実装するための基底クラスです。
#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;
}

参照

SFXXMLSAXParser | SFXXMLSAXParser::SetDefaultHandler

メンバ

コンストラクタ/デストラクタ
SFXXMLDefaultHandler( Void )
SFXXMLDefaultHandler クラスのコンストラクタです。
~SFXXMLDefaultHandler( Void )
SFXXMLDefaultHandler クラスのデストラクタです。
パブリック関数
Void AttributeDecl( SFXAnsiStringConstRef ename , SFXAnsiStringConstRef aname , SFXAnsiStringConstRef type , SFXAnsiStringConstRef valuedefault , SFXAnsiStringConstRef value )
ATTLIST 宣言の通知を受け取ります。
Void Characters( SFXAnsiStringConstRef string , BoolConst cdataSection = true )
文字データの通知を受け取ります。
Void Comment( SFXAnsiStringConstRef string )
コメントの通知を受け取ります。
Void ElementDecl( SFXAnsiStringConstRef name , SFXAnsiStringConstRef model )
要素型宣言の通知を受け取ります。
Void EndCDATA( Void )
CDATA セクションの終了通知を受け取ります。
Void EndDTD( Void )
DTD 宣言の終了通知を受け取ります。
Void EndDocument( Void )
文書の終了通知を受け取ります。
Void EndElement( SFXAnsiStringConstRef uri = SFXAnsiString::EmptyInstance() , SFXAnsiStringConstRef localname = SFXAnsiString::EmptyInstance() , SFXAnsiStringConstRef qname = SFXAnsiString::EmptyInstance() )
要素の終了通知を受け取ります。
Void EndEntity( SFXAnsiStringConstRef name )
エンティティの終了通知を受け取ります。
Void EndPrefixMapping( SFXAnsiStringConstRef prefix )
名前空間接頭辞と名前空間 URI のマッピングの終了通知を受け取ります。
Void ErrorReport( SFCErrorConst error , SFXAnsiStringConstRef errInfo )
エラーの通知を受け取ります。
Void ExternalEntityDecl( SFXAnsiStringConstRef name , SFXAnsiStringConstRef publicId , SFXAnsiStringConstRef systemId )
外部エンティティ宣言の通知を受け取ります。
Void IgnorableWhitespace( SFXAnsiStringConstRef string )
不要な空白文字の通知を受け取ります。
Void InternalEntityDecl( SFXAnsiStringConstRef name , SFXAnsiStringConstRef value )
内部エンティティ宣言の通知を受け取ります。
Void NotationDecl( SFXAnsiStringConstRef name , SFXAnsiStringConstRef publicId , SFXAnsiStringConstRef systemId )
記法宣言の通知を受け取ります。
Void ProcessingInstruction( SFXAnsiStringConstRef target , SFXAnsiStringConstRef data )
処理命令の通知を受け取ります。
Void StartCDATA( Void )
CDATA セクションの開始通知を受け取ります。
Void StartDTD( SFXAnsiStringConstRef name , SFXAnsiStringConstRef publicId , SFXAnsiStringConstRef systemId )
DTD 宣言の開始通知を受け取ります。
Void StartDocument( Void )
文書の開始通知を受け取ります。
Void StartElement( SFXAnsiStringConstRef uri , SFXAnsiStringConstRef localname , SFXAnsiStringConstRef qname , SFXXMLGrammar::XMLAttrListConstRef attrList )
要素の開始通知を受け取ります。
Void StartEntity( SFXAnsiStringConstRef name )
エンティティの開始通知を受け取ります。
Void StartPrefixMapping( SFXAnsiStringConstRef prefix , SFXAnsiStringConstRef uri )
名前空間接頭辞と名前空間 URI のマッピングの開始通知を受け取ります。
Void UnparsedEntityDecl( SFXAnsiStringConstRef name , SFXAnsiStringConstRef publicId , SFXAnsiStringConstRef systemId , SFXAnsiStringConstRef notationName )
解析対象外エンティティ宣言の通知を受け取ります。

SFXXMLDefaultHandler::SFXXMLDefaultHandler
SFXXMLDefaultHandler クラスのコンストラクタです。
[ public, explicit ]
SFXXMLDefaultHandler(Void);

SFXXMLDefaultHandler::~SFXXMLDefaultHandler
SFXXMLDefaultHandler クラスのデストラクタです。
[ public, virtual ]
virtual ~SFXXMLDefaultHandler(Void);

SFXXMLDefaultHandler::AttributeDecl
ATTLIST 宣言の通知を受け取ります。
[ public, virtual ]
Void AttributeDecl(
    SFXAnsiStringConstRef ename          // 関連要素名
    SFXAnsiStringConstRef aname          // 属性の名前
    SFXAnsiStringConstRef type           // 属性型を示す文字列
    SFXAnsiStringConstRef valuedefault   // 属性のデフォルト値を示す文字列
    SFXAnsiStringConstRef value          // 属性のデフォルトモード ( #IMPLIED、#REQUIRED、または #FIXED ) を示す文字列
);

SFXXMLDefaultHandler::Characters
文字データの通知を受け取ります。
[ public, virtual ]
Void Characters(
    SFXAnsiStringConstRef string    // XML 文書
    BoolConst cdataSection = true   // CDATASection かどうか
);

引数

string

XML 文書です。

cdataSection

SAX パーサーの場合、常に true となります。

解説

SAX パーサーは、SFXXMLDefaultHandler::Characters 関数を呼び出して、文字データを通知します。


SFXXMLDefaultHandler::Comment
コメントの通知を受け取ります。
[ public, virtual ]
Void Comment(
    SFXAnsiStringConstRef string   // コメントに含まれる文字を格納する配列
);

解説

外部 DTD サブセットも含め、文書の内外に存在するコメントの処理に使います。


SFXXMLDefaultHandler::ElementDecl
要素型宣言の通知を受け取ります。
[ public, virtual ]
Void ElementDecl(
    SFXAnsiStringConstRef name    // 要素名
    SFXAnsiStringConstRef model   // 正規化された内容モデル ( content model )
);

解説

[Note] 正規化された内容モデル(Normalized Content Model):

パラメータ エンティティは展開され、余分な空白文字は削除された内容モデルのことです。


SFXXMLDefaultHandler::EndCDATA
CDATA セクションの終了通知を受け取ります。
[ public, virtual ]
Void EndCDATA(Void);

参照

SFXXMLDefaultHandler::StartCDATA


SFXXMLDefaultHandler::EndDTD
DTD 宣言の終了通知を受け取ります。
[ public, virtual ]
Void EndDTD(Void);

解説

文書に DOCTYPE 宣言が含まれていない場合は呼び出されません。

参照

SFXXMLDefaultHandler::StartDTD


SFXXMLDefaultHandler::EndDocument
文書の終了通知を受け取ります。
[ public, virtual ]
Void EndDocument(Void);

参照

SFXXMLDefaultHandler::StartDocument


SFXXMLDefaultHandler::EndElement
要素の終了通知を受け取ります。
[ 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 イベントがあります。要素が空である場合も同様です。

参照

SFXXMLDefaultHandler::StartElement


SFXXMLDefaultHandler::EndEntity
エンティティの終了通知を受け取ります。
[ public, virtual ]
Void EndEntity(
    SFXAnsiStringConstRef name   // エンティティの名前
);

参照

SFXXMLDefaultHandler::StartEntity


SFXXMLDefaultHandler::EndPrefixMapping
名前空間接頭辞と名前空間 URI のマッピングの終了通知を受け取ります。
[ public, virtual ]
Void EndPrefixMapping(
    SFXAnsiStringConstRef prefix   // マッピングされていた名前空間接頭辞
);

参照

SFXXMLDefaultHandler::StartPrefixMapping


SFXXMLDefaultHandler::ErrorReport
エラーの通知を受け取ります。
[ public, virtual ]
Void ErrorReport(
    SFCErrorConst error             // エラーコード
    SFXAnsiStringConstRef errInfo   // 具体的なエラーメッセージ
);

解説

XML 構文解析エラー、DTD、スキーマの妥当性の問題、メモリ不足などのエラー通知を受け取ります。


SFXXMLDefaultHandler::ExternalEntityDecl
外部エンティティ宣言の通知を受け取ります。
[ public, virtual ]
Void ExternalEntityDecl(
    SFXAnsiStringConstRef name       // エンティティの名前
    SFXAnsiStringConstRef publicId   // エンティティの公開識別子
    SFXAnsiStringConstRef systemId   // エンティティのシステム識別子
);

SFXXMLDefaultHandler::IgnorableWhitespace
不要な空白文字の通知を受け取ります。
[ public, virtual ]
Void IgnorableWhitespace(
    SFXAnsiStringConstRef string   // XML 文書の文字
);

解説

インデントを解析する場合、SFXXMLDefaultHandler::IgnorableWhitespace 関数を使って、要素に含まれる余分な空白文字を通知します。


SFXXMLDefaultHandler::InternalEntityDecl
内部エンティティ宣言の通知を受け取ります。
[ public, virtual ]
Void InternalEntityDecl(
    SFXAnsiStringConstRef name    // エンティティの名前
    SFXAnsiStringConstRef value   // エンティティのテキスト
);

SFXXMLDefaultHandler::NotationDecl
記法宣言の通知を受け取ります。
[ public, virtual ]
Void NotationDecl(
    SFXAnsiStringConstRef name       // 記法名
    SFXAnsiStringConstRef publicId   // 記法の公開識別子
    SFXAnsiStringConstRef systemId   // 記法のシステム識別子
);

参照

SFXXMLDefaultHandler::UnparsedEntityDecl


SFXXMLDefaultHandler::ProcessingInstruction
処理命令の通知を受け取ります。
[ public, virtual ]
Void ProcessingInstruction(
    SFXAnsiStringConstRef target   // 処理命令のターゲット
    SFXAnsiStringConstRef data     // 処理命令を受けるデータ
);

SFXXMLDefaultHandler::StartCDATA
CDATA セクションの開始通知を受け取ります。
[ public, virtual ]
Void StartCDATA(Void);

解説

CDATA セクションは、正規の characters イベントを介して通知されます。このイベントは境界の通知だけに使われます。

参照

SFXXMLDefaultHandler::EndCDATA


SFXXMLDefaultHandler::StartDTD
DTD 宣言の開始通知を受け取ります。
[ public, virtual ]
Void StartDTD(
    SFXAnsiStringConstRef name       // 文書型名
    SFXAnsiStringConstRef publicId   // 宣言された外部 DTD サブセットの公開識別子
    SFXAnsiStringConstRef systemId   // 宣言された外部 DTD サブセットのシステム識別子
);

解説

文書に DOCTYPE 宣言が含まれていない場合は呼び出されません。 StartDTD、EndDTD イベントは、 StartDocument、EndDocument イベント内の最初の StartElement イベントの前に出現します。

参照

SFXXMLDefaultHandler::EndDTD


SFXXMLDefaultHandler::StartDocument
文書の開始通知を受け取ります。
[ public, virtual ]
Void StartDocument(Void);

参照

SFXXMLDefaultHandler::EndDocument


SFXXMLDefaultHandler::StartElement
要素の開始通知を受け取ります。
[ public, virtual ]
Void StartElement(
    SFXAnsiStringConstRef uri                     // 要素の名前空間 URI
    SFXAnsiStringConstRef localname               // 接頭辞を含まないローカル名
    SFXAnsiStringConstRef qname                   // 接頭辞付きの修飾名
    SFXXMLGrammar::XMLAttrListConstRef attrList   // 要素に付加された属性リスト
);

解説

SAX パーサーは XML 文書内の各要素の前で、SFXXMLDefaultHandler::StartElement 関数を呼び出します。各 StartElement イベントには対応する EndElement イベントがあります。要素が空である場合も同様です。

対応する EndElement イベントの前に、要素のコンテンツ全部が順番に通知されます。

参照

SFXXMLDefaultHandler::EndElement


SFXXMLDefaultHandler::StartEntity
エンティティの開始通知を受け取ります。
[ public, virtual ]
Void StartEntity(
    SFXAnsiStringConstRef name   // エンティティの名前
);

引数

name

パラメータ エンティティの場合、エンティティの名前は「 % 」で始まります。外部 DTD サブセットの場合は、 "[dtd]" で始まります。

解説

エンティティは、正規化された名前で通知されます。

参照

SFXXMLDefaultHandler::EndEntity


SFXXMLDefaultHandler::StartPrefixMapping
名前空間接頭辞と名前空間 URI のマッピングの開始通知を受け取ります。
[ public, virtual ]
Void StartPrefixMapping(
    SFXAnsiStringConstRef prefix   // 名前空間接頭辞
    SFXAnsiStringConstRef uri      // 名前空間接頭辞のマップ先名前空間 URI
);

参照

SFXXMLDefaultHandler::EndPrefixMapping


SFXXMLDefaultHandler::UnparsedEntityDecl
解析対象外エンティティ宣言の通知を受け取ります。
[ public, virtual ]
Void UnparsedEntityDecl(
    SFXAnsiStringConstRef name           // エンティティの名前
    SFXAnsiStringConstRef publicId       // エンティティの公開識別子
    SFXAnsiStringConstRef systemId       // エンティティのシステム識別子
    SFXAnsiStringConstRef notationName   // 記法名
);

解説

記法名は、NotationDecl イベントによって通知される記法に一致します。あとで参照できるようにエンティティを記録するアプリケーションと、記録しないアプリケーションがあります。

解析対象外エンティティは属性値として表示されることもあります。

参照

SFXXMLDefaultHandler::NotationDecl