我想通过以下方式在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 ++实例设置为用户数据,因为这些func只设置了一个全局var(不是线程安全的)
- 使用xmlNewParserCtxt()并将ctx-> sax-> serror设置为常规C ++方法 - 错误处理程序必须是静态的
- 与之前的相同但是使用静态类方法 - 实际上它确实有效,但同时我想设置ctx-> user_data(到当前C ++实例的'this') - 这会使解析器崩溃,它看起来好像在libxml2内部ctx-> user_data通过应该只有ctx的函数传递...但是这种情况一直发生,即看起来像一个特征而不是一个bug :-)
现在,有人知道如何让它发挥作用吗?
很多thx !!!