SAX パーサーを使って XML 文書を解析する
SFXXMLSAXParser::Parse を使って、XML 文書を読み込み、解析します。
SFXXMLSAXParser クラスを使うには、 SFXXMLDefaultHandler クラスを継承するクラスを実装する必要があります。
XML文書を解析するサンプルコードSFXXMLSAXParser saxparser; MyXMLHandler handler; // イベントを通知するハンドラ インターフェースを設定する saxparser.SetDefaultHandler(&handler); // パーサーを開始する // アプリのホームフォルダにある file.xml を解析する saxparser.Parse("file.xml");ハンドラ クラスの定義( SFXXMLDefaultHandler クラスを継承するクラス )
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); 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); };ハンドラ クラスの実装( SFXXMLDefaultHandler クラスを継承するクラス )
// コンストラクタ 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()); } // 要素の終了通知を受け取るハンドラ 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; } Void MyXMLHandler::EndPrefixMapping(SFXAnsiStringConstRef prefix) { return; } Void MyXMLHandler::StartPrefixMapping(SFXAnsiStringConstRef prefix, SFXAnsiStringConstRef uri) { return; } Void MyXMLHandler::Comment(SFXAnsiStringConstRef string) { return; } Void MyXMLHandler::EndCDATA(Void) { return; } Void MyXMLHandler::EndDTD(Void) { return; } Void MyXMLHandler::EndEntity(SFXAnsiStringConstRef name) { return; } Void MyXMLHandler::StartCDATA(Void) { return; } 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; } 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) { TRACE("----- ErrorReport ------"); TRACE("error-%x", error); TRACE("errInfo-%s", errInfo.GetCString()); }