1
我有使用LIBXML SAX解析器的win32 C++代碼。此代碼解析大XML文件(> 1Gb)並通過xsd模式驗證它。當xsd驗證錯誤引發LIBXML調用回調並繼續解析時。我想在這個回調中停止解析過程。到目前爲止,我通過提出C++異常來實現這個結果。但是這種方法會導致未釋放的資源並導致內存泄漏。如何在任何時候停止使用LIBXML SAX解析xml文檔?
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)
但在架構錯誤回調函數沒有解析器上下文。
請幫忙! 謝謝!
謝謝,無論如何! –