代码之家  ›  专栏  ›  技术社区  ›  Praetorian Luchian Grigore

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

  •  3
  • Praetorian Luchian Grigore  · 技术社区  · 15 年前

    parse()

    #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解析器是两种不同的动物,那么为什么DOM解析器会抛出SAX异常呢?

    4 回复  |  直到 10 年前
        1
  •  4
  •   Vanni Totaro    15 年前

    看到了吗 ErrorHandler

    必须声明并定义继承自的类 错误处理程序 HandlerBase 类)。

    setErrorHandler 在解析器实例上传递错误处理程序的实例,即。 pDOMParser_->setErrorHandler(your_handler_instance) .

    XELSCE-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);
            }
    };
    
        2
  •  0
  •   anon anon    15 年前

    我不认为文件说了你认为它做什么,它说它会;投掷:

    文件。

    我认为,可能出现SAX异常的原因是Xerces使用SAX构建其DOM。

        3
  •  0
  •   Greg Domjan    15 年前

    2.8文件(你链接过)说,

    如果路径是 相对的

    你真的在用相对路径吗? 也许在某些特定于平台的情况下曾经是这样,但我看不出Xercese2.7中在哪里提出了这种情况(我碰巧有代码)。

    在LocalFileFormatTarget中,它可以抛出“CouldNotOpenFile”的异常,但没有记录为引发异常。

    你用的是什么版本的xerces?

    打开文件以进行读取/解析看起来可能会引发类型为“CouldNotReadFromFile”的丢失文件的异常。但这可能与Vanni所说的错误处理有关。

        4
  •  0
  •   Chuck Claunch    8 年前

    XercesDOMParser 抛出 SAXParseException 如果找不到文件。不需要自定义错误处理程序,只需捕获该异常。

    推荐文章