libxml2 с обработчиком саксофонов по умолчанию и пользовательским обработчиком ошибок

Я хотел бы использовать простой синтаксический анализатор libxml2 в программе на C ++ следующим образом:

  1. обработчик саксофона по умолчанию подходит (на самом деле я бы хотел избежать написания своего собственного. Я понимаю, что могу делать то, что хочу, с помощью обработчика саксофона)
  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 (в ‘this’ текущего экземпляра C ++) — что приводит к сбою синтаксического анализатора, он выглядит как будто внутри libxml2 ctx-> user_data передается через функции, где должен быть только ctx … однако это происходит последовательно, т.е. выглядит скорее как функция, чем ошибка 🙂

Кто-нибудь знает, как заставить это работать?

Многие, спасибо!

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …