Xerces C ++:不存在的文件没有错误

时间:2010-07-12 22:43:45

标签: c++ xml xerces

我正在使用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异常?

4 个答案:

答案 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。不需要自定义错误处理程序,只需捕获该异常。