使用xercesc准备xsd文件时出错

时间:2014-10-23 22:56:42

标签: c++ xerces-c

我正在尝试使用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;
}

请帮忙!

1 个答案:

答案 0 :(得分:0)

博客条目

Multi-threaded XML parsing with Xerces-C++

解释了如何在多线程应用程序中重用缓存模式。该博客名为 A Sense of Design ,由Boris Kolpackov撰写。

我还建议您查看此Public Domain C ++文件(也是同一作者)

http://scm.codesynthesis.com/?p=xsd/xsd.git;a=blob;f=examples/cxx/tree/performance/parsing.cxx;hb=HEAD

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