У меня есть код win32 C++, который использует парсер LIBXML SAX. Этот код анализирует большой XML-файл (> 1Gb) и проверяет его с помощью схемы xsd. Когда ошибка проверки xsd возникает, LIBXML вызывает обратный вызов и продолжает синтаксический анализ. Я хочу остановить процесс разбора в этом обратном вызове. Пока я достигаю этого результата, создавая исключение C++. Но этот подход оставляет нереализованные ресурсы и вызывает утечку памяти.Как остановить анализ XML-документа с помощью LIBXML SAX в любое время?
SAX код Хронометраж:
xmlSchemaParserCtxtPtr sch = xmlSchemaNewParserCtxt("MUXGate.xsd");
xmlSchemaPtr schema = xmlSchemaParse(sch);
xmlSchemaValidCtxtPtr vsch = xmlSchemaNewValidCtxt(schema);
context.vsch = xmlSchemaNewValidCtxt(schema);
xmlSchemaSetValidErrors(
vsch,
xmlMySchemaValidityErrorFunc,
xmlMySchemaValidityWarningFunc,
&context);
xmlSAXHandlerPtr hndlrptr = &my_handler;
void* ctxptr = &context;
xmlSchemaSAXPlugPtr saxPlug = xmlSchemaSAXPlug(vsch,&hndlrptr,&ctxptr);
try{
if (xmlSAXUserParseFile(hndlrptr, ctxptr , "errschema.xml1") < 0) {
xmess<<"Parse error\n";
} else
xmess<<"Parse ok\n";
if(context.SchemaError)
{
xmess <<"Schema error\n";
}
}
catch(...) //Catching exception
{
xmess<<"Exception\n";
}
xmlSchemaSAXUnplug(saxPlug);
xmlSchemaFreeValidCtxt(context.vsch);
xmlSchemaFreeValidCtxt(vsch);
xmlSchemaFree(schema);
xmlSchemaFreeParserCtxt(sch);
Схема ошибки обратного вызова:
void xmlMySchemaValidityErrorFunc (void * ctx,
const char * msg,
...)
{
MyContext& context = *(MyContext*)ctx;
context.SchemaError = true;
char buf[1024];
va_list args;
va_start(args, msg);
int len = vsnprintf_s(buf, sizeof(buf), sizeof(buf)/sizeof(buf[0]), msg, args);
va_end(args);
puts(buf);
throw new int(1); //throwing an exception
}
Существует функция void xmlStopParser (xmlParserCtxtPtr ctxt)
, но нет никакого контекста парсер в функции схемы ошибки обратного вызова.
Пожалуйста, помогите! Спасибо!
Спасибо, во всяком случае! –