Xerces C ++: нет ошибки для несуществующего файла - PullRequest
3 голосов
/ 13 июля 2010

Я использую анализатор DOM Xerces C ++ для чтения некоторых файлов 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?

Ответы [ 4 ]

4 голосов
/ 13 июля 2010

См. ErrorHandler документацию.

Вы должны объявить и определить класс, который наследуется от ErrorHandler и реализует его виртуальные методы (или вы можете расширить класс HandlerBase).

Затем вы должны вызвать setErrorHandler в вашем экземпляре синтаксического анализатора, передав экземпляр вашего обработчика ошибок, т.е. pDOMParser_->setErrorHandler(your_handler_instance).

Пример использования из примеров соединительных линий Xerces-C ++: строки 231-233 из 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);
        }
};
0 голосов
/ 18 января 2018

Я знаю, что это старый, но да, действительно, я обнаружил, что XercesDOMParser выдает SAXParseException, если файл не найден. Не требуется пользовательский обработчик ошибок, просто перехватите это исключение.

0 голосов
/ 13 июля 2010

Документ 2,8 (вы связали) говорит,

XMLException Если путь относительно и не разрешается должным образом в файл

вы действительно используете относительный путь? может быть, это было в некоторых случаях для конкретной платформы, но я не вижу, где это поднято в Xercese 2.7 (код, который у меня есть).

Глядя на LocalFileFormatTarget, он может выдать исключение для 'CouldNotOpenFile', но это не задокументировано как создание исключения.

Какую версию xerces вы используете?

Открытие файла для чтения / анализа выглядит так, как будто это может вызвать исключение для отсутствующего файла типа 'CouldNotReadFromFile'. Но это может быть связано с обработкой ошибок, о чем говорит Ванни.

0 голосов
/ 13 июля 2010

Я не думаю, что документация говорит, что вы думаете, она делает, она говорит, что будет; бросить:

XMLException Если путь относительно и не разрешается должным образом файл.

Ваша задача, если вы решите принять ее, это выяснить, что означает «родственник». Боюсь, я годами не использовал Xerces (хотя он достаточно компетентен) - я предпочитаю использовать небольшие, простые парсеры SAX для построения своих собственных моделей, а не использовать DOM, и не могу вспомнить, как работает материал с именами .

И я думаю, что причина, по которой вы можете получить исключения SAX, заключается в том, что Xerces использует SAX для создания своей DOM.

...