我正在使用Xerces C ++ DOM解析器来读取Visual C ++项目中的一些XML文件。我有一个带有parse()
方法的类,它应该读取并验证我的XML源文件。这就是方法的样子:
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
using namespace std;
XERCES_CPP_NAMESPACE_USE
unsigned long RulesParser::parse( const wstring &xmlFile )
{
if( parserInitialized_ == false ) {
try {
XMLPlatformUtils::Initialize(); /* initialize xerces */
} catch( XMLException const &e ) {
return Status::PARSER_INIT_FAIL;
}
}
parserInitialized_ = true; /* indicate xerces has been
successfully initialized */
if( pDOMParser_ != NULL ) {
delete pDOMParser_;
}
pDOMParser_ = new XercesDOMParser; /* create a DOM parser instance */
/* set xerces options */
pDOMParser_->setDoNamespaces( true ); /* enable namespace processing */
pDOMParser_->setDoSchema( true ); /* enable schema processing */
pDOMParser_->setValidationScheme( XercesDOMParser::Val_Always ); /* parser always validates */
pDOMParser_->setValidationSchemaFullChecking( true ); /* enable full schema checking */
auto_ptr< LocalFileInputSource > srcFile; /* XML source file loader */
try {
srcFile.reset( new LocalFileInputSource( xmlFile.c_str() ) );
} catch( const XMLException &e ) {
return Status::XML_SOURCE_LOAD_ERROR;
}
/* parse the file */
try {
pDOMParser_->parse( *srcFile );
} catch( const XMLException &e ) {
return Status::XML_SOURCE_PARSE_ERROR;
} catch( const DOMException &e ) {
return Status::XML_SOURCE_PARSE_DOM_ERROR;
}
return Status::OK;
}
LocalFileInputSource
的{{3}}表示如果路径未解析为文件,构造函数将抛出XMLException
。但是,我可以使用任意字符串调用此方法,并执行到最后,不会引发任何异常。我做错了什么?
此外,XercesDOMParser::parse()
的{{3}}表示SAXException
是其可以抛出的异常类型之一。我发现这令人困惑,因为据我所知,DOM和SAX解析器是两种不同的动物,为什么DOM解析器会抛出SAX异常?
答案 0 :(得分:4)
请参阅ErrorHandler
文档。
您必须声明并定义一个继承自ErrorHandler
的类并实现其虚方法(或者您可以扩展HandlerBase
类)。
然后,您必须在解析器实例上调用setErrorHandler
,传递错误处理程序的实例,即pDOMParser_->setErrorHandler(your_handler_instance)
。
来自Xerces-C ++主干示例的示例用法:rows 231-233 of SAXPrint.cpp。
更新:以下自定义错误处理程序示例。
#include <iostream>
#include <xercesc/sax/HandlerBase.hpp>
XERCES_CPP_NAMESPACE_USE
class CustomErrorHandler : public HandlerBase
{
public:
CustomErrorHandler() {}
void error(const SAXParseException& e)
{
handler(e);
}
void fatalError(const SAXParseException& e)
{
handler(e);
}
void warning(const SAXParseException& e)
{
handler(e);
}
private:
void handler(const SAXParseException& e)
{
char* message = XMLString::transcode(e.getMessage());
cerr << "line " << e.getLineNumber()
<< ", column " << e.getColumnNumber()
<< " -> " << message << "\n\n";
XMLString::release(&message);
}
};
答案 1 :(得分:0)
我不认为文档说明了你的想法,它会说它会;扔:
XMLException如果路径是相对的 而且没有正确地解决到 文件。
如果您选择接受它,您的任务就是找出“相对”意味着什么。我担心II多年来没有使用过Xerces(虽然它非常称职) - 我更喜欢使用小而简单的SAX解析器来构建我自己的模型而不是使用DOM,并且不记得文件名的工作原理
我认为您可能获得SAX异常的原因是Xerces使用SAX来构建其DOM。
答案 2 :(得分:0)
2.8 Doc(你已经链接)说,
XMLException 如果路径相对且未正确解析为文件
你实际上是在使用相对路径吗?
也许这曾经是某些平台特定情况的情况,但我无法看到Xercese 2.7中引发的这种情况(我碰巧遇到的代码)。
查看LocalFileFormatTarget,它可以为'CouldNotOpenFile'抛出异常,但不会记录为引发异常。
您使用的是什么版本的xerces?
打开文件进行读取/解析看起来可能会为“CouldNotReadFromFile”类型的丢失文件引发异常。但是,正如Vanni所说的那样,这可以赶上错误处理。
答案 3 :(得分:0)
我知道这已经过时了,但确实如果找不到该文件,我发现XercesDOMParser
会抛出SAXParseException
。不需要自定义错误处理程序,只需捕获该异常。