我正在使用Xerces C++ DOM解析器来读取一些XML文件,这些文件在Visual C++项目中。我有一个带有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 的文档中说,如果路径无法解析到文件,则构造函数会抛出 XMLException
异常。然而,我可以使用任意字符串调用此方法,并且执行到最后时没有引发任何异常。我做错了什么吗?
此外,XercesDOMParser::parse() 的文档中说,它可以抛出 SAXException
异常之一。我觉得这很令人困惑,因为据我所知,DOM 和 SAX 解析器是两种不同的工具,那么为什么 DOM 解析器会抛出 SAX 异常呢?
XercesDOMParser :: parse()
周围放置try ... catch
来捕获错误。 - Praetorianpraetorian20
: 我刚刚编辑了我的帖子,并附上了一个自定义错误类实现的示例。 - Vanni TotaroSAXPrint
示例链接。 - Praetorian