我想通过以下方式在 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 的函数传递......但是这种情况始终如一地发生,即看起来更像是一个特性而不是一个错误:-)
现在,有人知道如何让它工作吗?
很多谢谢!