2

次のように、C++ プログラムで単純な libxml2 パーサーを使用したいと思います。

  1. デフォルトの sax ハンドラーで問題ありません (実際には、独自のハンドラーを作成する手間を省きたいのですが、カスタムの sax ハンドラーを使用してやりたいことができることは理解しています)。
  2. パーサーは、任意にインスタンス化できる (おそらくマルチスレッド化された) C++ クラスに埋め込む必要があります。libxml2 パーサー コンテキストはメンバー var として
  3. libxml2 を使用している他のコンポーネントもありますが、私の制御範囲外です (それらが何をし、どのように libxml2 を使用するかを正確に伝えることはできません)。
  4. 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!!!

4

0 に答える 0