使用xercesc准备xsd文件时出错

Error preparsing a xsd file with xercesc

本文关键字:出错 文件 xsd xercesc 准备 使用      更新时间:2023-10-16

我正试图用xerces-c准备一个xsd文件,以便在多线程应用程序中使用GrammarPool。问题是我正确地准备了xsd(没有错误处理程序的通知),但当我解析一个有效的xml文件(通过在线验证器检查是否有效)时,解析失败,告诉我属性和元素尚未声明。现在我将向您展示我准备文件的代码。

XMLGrammarPool gp = new XMLGrammarPoolImpl (XMLPlatformUtils::fgMemoryManager);
XercesDOMParser* parser = new XercesDOMParser(0, XMLPlatformUtils::fgMemoryManager, gp);
parser->cacheGrammarFromParse(true);
error_handler eh;
parser->setErrorHandler(&eh);
parser->setDoSchema(true);
parser->setDoNamespaces(true);
if(!parser->loadGrammar("file.xsd", Grammar::SchemaGrammarType, true) || eh.failed()){
    delete gp;
    XMLPlatformUtils::Terminate();
    return -6;
}
gp->lockPool();

这是为了解析xml文件:

XercesDOMParser *parser = new XercesDOMParser(0, XMLPlatformUtils::fgMemoryManager, gp);
error_handler eh;
parser->setErrorHandler(&eh);
parser->setValidationSchemaFullChecking(true);
parser->setIgnoreAnnotations(true);
parser->setCreateCommentNodes(false);
parser->useCachedGrammarInParse(true);
parser->setValidationScheme(AbstractDOMParser::ValSchemes::Val_Always);
MemBufInputSource buf((const XMLByte*)xml_file, size, "xml_file in memory");
parser->parse(buf);
if(eh.failed()){
    delete parser;
    return;
}

请帮忙!

博客条目

基于Xerces-C++的多线程XML解析

解释了如何在多线程应用程序中重用缓存的模式。该博客名为《设计感》,作者是Boris Kolpackov。

我还建议查看这个公共域C++文件(也是由同一作者)

http://scm.codesynthesis.com/?p=xsd/xsd.git;a=斑点;f=示例/ccxx/tree/performance/parsing.cxx;hb=头

它向我们展示了如何让Xerces解析一次模式,然后读取许多XML文件。实现的某些部分与CodeSynthesis XSD有关,因此您需要对其进行一些修改。