ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング : SophiaFramework 逆引き FAQ・コード集

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());
}