Xerces C++:不存在的文件没有错误
我正在使用 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;
}
文档 < code>LocalFileInputSource 表示如果路径未解析为文件,构造函数将抛出 XMLException
。但是,我可以使用任意字符串调用此方法,并且它会执行到最后,而不会引发任何异常。我做错了什么?
另外,XercesDOMParser 的 文档: :parse()
表示 SAXException
是它可以抛出的异常类型之一。我觉得这很令人困惑,因为据我了解,DOM 和 SAX 解析器是两种不同的动物,那么为什么 DOM 解析器会抛出 SAX 异常呢?
I'm using the Xerces C++ DOM parser to read some XML files in a Visual C++ project. I have a class with a parse()
method that is supposed to read and validate my XML source file. This is what the method looks like:
#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;
}
The documentation for LocalFileInputSource
says the constructor will throw an XMLException
if the path doesn't resolve to a file. However, I can call this method with any arbitrary string and it executes to the end without any exceptions being raised. What am I doing wrong?
Also, the documentation for XercesDOMParser::parse()
says a SAXException
is one of the types of exceptions that it can throw. I find this confusing because from what I understand DOM and SAX parsers are 2 different animals, so why would the DOM parser throw a SAX exception?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
请参阅
ErrorHandler
文档。您必须声明并定义一个继承自
ErrorHandler
并实现其虚拟方法的类(或者您可以扩展HandlerBase
类)。然后你必须调用
setErrorHandler
在解析器实例上传递错误处理程序的实例,即pDOMParser_->setErrorHandler(your_handler_instance)
。Xerces-C++ 主干样本的用法示例: SAXPrint.cpp 的第 231-233 行。
更新:下面是自定义错误处理程序的示例。
See
ErrorHandler
documentation.You must declare and define a class that inherits from
ErrorHandler
and implements its virtual methods (or you can extend theHandlerBase
class).Then you must call
setErrorHandler
on your parser instance passing an instance of your error handler, i.e.pDOMParser_->setErrorHandler(your_handler_instance)
.Example usage from Xerces-C++ trunk samples: rows 231-233 of SAXPrint.cpp.
Update: example of custom error handler below.
我不认为文档说的是你认为它会做什么,它只是说它会做;扔:
如果您选择接受的话,您的任务就是找出“亲戚”的含义。恐怕我已经很多年没有使用 Xerces 了(尽管它非常强大)——我更喜欢使用小型、简单的 SAX 解析器来构建我自己的模型,而不是使用 DOM,并且不记得文件名的内容是如何工作的。
我认为您可能会遇到 SAX 异常的原因是 Xerces 使用 SAX 来构建其 DOM。
I don't think that the documentation says what you think it does, it says it will; throw:
Your task, should you choose to accept it, is to find out what "relative" means. I'm afraid I I haven't used Xerces for years (though it is quite competent) - I prefer to use small, simple SAX parsers to build my own models rather than use a DOM, and can't remember how the filename stuff works.
And I think that the reason that you might get SAX exceptions is that Xerces uses SAX to build its DOM.
2.8 Doc(您已链接)说,
您实际上使用的是相对路径吗?也许对于某些特定于平台的情况曾经是这种情况,但我看不到 Xercese 2.7 中哪里提出了这种情况(我碰巧有的代码)。
查看 LocalFileFormatTarget 它可以引发“CouldNotOpenFile”异常,但没有记录为引发异常。
您使用什么版本的 xerces?
打开文件进行读取/解析看起来可能会引发“CouldNotReadFromFile”类型的丢失文件的异常。但这可能会赶上 Vanni 所说的错误处理。
The 2.8 Doc (you have linked) says,
are you actually using a relative path?maybe this used to be the case for some platform specific cases, but I can't see where this is raised in Xercese 2.7 (code I happen to have).
Looking at LocalFileFormatTarget it can throw an exception for 'CouldNotOpenFile', but it isn't documented as raising an exception.
What version of xerces are you using?
Opening the file for reading/parsing looks like it might raise an exception for the missing file of type 'CouldNotReadFromFile'. But that could be caught up with the error handling as Vanni is talking about.
我知道这已经很旧了,但是确实,我发现如果找不到文件,
XercesDOMParser
会抛出SAXParseException
。不需要自定义错误处理程序,只需捕获该异常即可。I know this is old, but yes indeed I found that
XercesDOMParser
throws aSAXParseException
if the file is not found. No custom error handler needed, just catch that exception.