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 的函数传递......但是这种情况始终如一地发生,即看起来更像是一个特性而不是一个错误:-)

现在,有人知道如何让它工作吗?

很多谢谢!

4

0 回答 0