次のように、C++ プログラムで単純な libxml2 パーサーを使用したいと思います。
- デフォルトの sax ハンドラーで問題ありません (実際には、独自のハンドラーを作成する手間を省きたいのですが、カスタムの sax ハンドラーを使用してやりたいことができることは理解しています)。
- パーサーは、任意にインスタンス化できる (おそらくマルチスレッド化された) C++ クラスに埋め込む必要があります。libxml2 パーサー コンテキストはメンバー var として
- libxml2 を使用している他のコンポーネントもありますが、私の制御範囲外です (それらが何をし、どのように libxml2 を使用するかを正確に伝えることはできません)。
- C++ クラスで、stderr に出力するだけでなく、エラーを収集して例外をスローするカスタム エラー ハンドラを使用したい
例:
class XmlParser
{
public:
XmlDoc * parseText(const char * txt, ...);
private:
xmlParserCtxtPtr ctx;
static void xmlErrorHandler(void * userData, xmlErrorPtr err);
}
これが機能しないものです(私のテストと理解に):
- xmlSetStructuredErrorFunc() または xmlSetGenericErrorFunc() を使用し、現在の C++ インスタンスをユーザー データとして設定する
- xmlNewParserCtxt() を使用し、ctx->sax->serror を通常の C++ メソッドに設定します - エラー ハンドラは静的でなければなりません
- 前と同じですが、静的クラスメソッドを使用します-実際には機能しますが、同時にctx-> user_dataを(現在のC++インスタンスの「this」に)設定したい-パーサーがクラッシュし、内部のように見えますlibxml2 の ctx->user_data は、ctx だけが存在するはずの関数を介して渡されます...しかし、それは一貫して発生します。つまり、バグというより機能のように見えます :-)
さて、これを機能させる方法を知っている人はいますか?
多くthx!!!