我正在尝试使用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;
}
请帮忙!
答案 0 :(得分:0)
博客条目
Multi-threaded XML parsing with Xerces-C++
解释了如何在多线程应用程序中重用缓存模式。该博客名为 A Sense of Design ,由Boris Kolpackov撰写。
我还建议您查看此Public Domain C ++文件(也是同一作者)
它向我们展示了如何让Xerces解析一次架构,然后读取一些XML文件。实现的某些部分与CodeSynthesis XSD相关,因此您需要对其进行一些修改。