我正在使用Xerces C++ DOM解析器讀取Visual C++項目中的一些XML文件。我有一個parse()
方法,應該讀取和驗證我的XML源文件。這是該方法的樣子:Xerces C++:對於不存在的文件沒有錯誤
#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;
}
的documentation爲LocalFileInputSource
說,構造函數將拋出一個XMLException
如果路徑沒有解決到一個文件中。但是,我可以用任何任意字符串調用此方法,並且在不引發任何異常的情況下執行到最後。我究竟做錯了什麼?
另外,documentation的XercesDOMParser::parse()
表示SAXException
是它可以拋出的異常類型之一。我覺得這很令人困惑,因爲從我所瞭解的DOM和SAX解析器是2種不同的動物,那麼爲什麼DOM解析器會拋出一個SAX異常?
我會試試這個。有趣的是,我還沒有遇到任何Xerces教程,說這需要完成。他們都樂於把'try ... catch'放在'XercesDOMParser :: parse()'附近來捕獲錯誤。 – Praetorian 2010-07-12 23:17:54
@''praetorian20':我剛剛編輯了一篇自定義錯誤類實現示例。 – 2010-07-12 23:31:16
工作!非常感謝您的示例,並將鏈接發佈到'SAXPrint'示例。 – Praetorian 2010-07-13 00:08:29