4

Xerces C ++ DOMパーサーを使用して、VisualC++プロジェクトのいくつかの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コンストラクターはをスローします。XMLExceptionただし、このメソッドは任意の文字列で呼び出すことができ、例外が発生することなく最後まで実行されます。私は何が間違っているのですか?

また、のドキュメントXercesDOMParser::parse()は、aSAXExceptionがスローされる可能性のある例外のタイプの1つが記載されています。私が理解していることから、DOMパーサーとSAXパーサーは2つの異なる動物であるため、これは紛らわしいと思います。それでは、なぜDOMパーサーがSAX例外をスローするのでしょうか。

4

4 に答える 4

4

ErrorHandlerドキュメントを参照してください。

仮想メソッドを継承しErrorHandlerて実装するクラスを宣言および定義する必要があります(またはHandlerBaseクラスを拡張できます)。

setErrorHandler次に、エラーハンドラのインスタンスを渡すパーサーインスタンスを呼び出す必要がありますpDOMParser_->setErrorHandler(your_handler_instance)

Xerces-C ++トランクサンプルの使用例:SAXPrint.cppの行231-233

更新:以下のカスタムエラーハンドラーの例。

#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);
        }
};
于 2010-07-12T22:54:25.123 に答える
0

私は、ドキュメンテーションがあなたがそれが何をすると思うかを述べているとは思いません、それはそうなると言っています。投げる:

XMLExceptionパスが相対的であり、ファイルに適切に解決されない場合。

あなたがそれを受け入れることを選択した場合、あなたの仕事は「相対的」が何を意味するかを見つけることです。IIはXercesを何年も使用していないのではないかと思います(非常に有能ですが)-DOMを使用するよりも、小さくて単純なSAXパーサーを使用して独自のモデルを構築することを好み、ファイル名がどのように機能するかを思い出せません。

また、SAX例外が発生する理由は、XercesがSAXを使用してDOMを構築しているためだと思います。

于 2010-07-12T23:00:56.603 に答える
0

2.8 Doc(リンクしました)は次のように述べています。

XMLExceptionパスが相対的であり、ファイルに適切に解決されない場合

実際に相対パスを使用していますか? これは、一部のプラットフォーム固有のケースに当てはまる可能性がありますが、Xercese 2.7(たまたま持っているコード)でこれがどこで発生するかわかりません。

LocalFileFormatTargetを見ると、「CouldNotOpenFile」の例外がスローされる可能性がありますが、例外が発生することは文書化されていません。

どのバージョンのxercesを使用していますか?

読み取り/解析のためにファイルを開くと、タイプ'CouldNotReadFromFile'の欠落しているファイルの例外が発生する可能性があるようです。しかし、Vanniが話しているように、それはエラー処理に追いつく可能性があります。

于 2010-07-12T23:05:38.887 に答える
0

私はこれが古いことを知っています、しかし確かに私はファイルが見つからない場合にそれがXercesDOMParserスローすることを発見しました。SAXParseExceptionカスタムエラーハンドラは必要ありません。その例外をキャッチするだけです。

于 2018-01-17T21:09:29.063 に答える