- - PR -
Xerces C++ SAX DTDを使った妥当性検証について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-07-19 01:11
お世話になっております。
かずです。質問ばかりで申し訳ございません。 どうぞよろしくお願いします。 ライブラリ:Xerces C++ v2.7.0 OS:Linux(SUSE) 1.DTDがSYSTEM識別子から取得できない 2.XMLが整形式でない 3.DTDの構文が間違っている 上記のエラーに関しては、catchすることはできました。 4.DTDの定義による、XML文書に対する妥当性検証 のエラーに関して、例外がthrowされません。 下記のソース抜粋のように、フィーチャーの指定を行えばよいかと思っているのですが、 違うのでしょうか?? 皆様、ご教授お願いします。 // SAXパーサオブジェクトを作成 SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); parser->setFeature(XMLUni::fgSAX2CoreValidation, true); try { // XMLファイルのパースを実行 parser->parse("hogehoge.xml"); } catch (const XMLException& toCatch) { return -1; } catch (const SAXParseException& toCatch) { return -2; } catch (...) { return -3; } 以上です。 よろしくお願いします。 |
|
投稿日時: 2006-07-19 11:52
HandlerBase クラスは、DocumentHandler インタフェースのほか、ErrorHandler、DTDHandler、EntityResolver の各インタフェースを実装し、それらにデフォルトの定義を与えています。
http://hp.vector.co.jp/authors/VA024451/cppdocuments/xercesc/startup.html 先に、、ErrorHandler、で握りつぶされているかも。 |
|
投稿日時: 2006-07-19 13:13
MMXさん、お返事ありがとうございます。
>先に、、ErrorHandler、で握りつぶされているかも。 どのように確認すればよいのでしょうか?? 先にあげました、ソースの抜粋ですが、一部抜けていたので、追記します。 // SAXパーサオブジェクトを作成 SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); parser->setFeature(XMLUni::fgSAX2CoreValidation, true); // カスタマイズされたハンドラーオブジェクトを作成 MyHandler* customHandler = new MyHandler(); parser->setContentHandler(customHandler); parser->setErrorHandler(customHandler); ※MyHandlerは、DefaultHandlerを継承しています。 startElement、characters、endElementの3メソッドのみ オーバーライドしています。 以上をご参考によろしくお願いします。 情報の不足等ございましたら、お知らせください。 |
|
投稿日時: 2006-07-19 13:31
>先に、、ErrorHandler、で握りつぶされているかも。
どのように確認すればよいのでしょうか?? http://hp.vector.co.jp/authors/VA024451/cppdocuments/xercesc/startup.html の 、、ErrorHandler、のリンクをたどると、Detailed Description の最終段落で 握りつぶしている らしい The HandlerBase class provides a default implementation of this interface, ignoring warnings and recoverable errors and throwing a SAXParseException for fatal errors. HandlerBaseクラスはこのインターフェースのデフォルト実施を提供します。 そして、警告と回収可能なエラーを無視して、 致命的エラーのためにSAXParseExceptionを投げます。 An application may extend that class rather than implementing the complete interface itself. アプリケーションは、完全なインターフェース自体を実装するねん ことよりむしろそのクラスを延長するねん かもしれまへん。 (翻訳オプション 関西弁) |
|
投稿日時: 2006-07-21 13:29
MMXさん、お返事ありがとうございます。
原因は、MMXさんの教えて下さった通りでした。 私の場合、HandlerBaseではなく、DefaultHandlerでしたが、同じでした。 DefaultHandlerでは、 warning (const SAXParseException &exc) -> 何もしない error (const SAXParseException &exc) -> 何もしない fatalError (const SAXParseException &exc) -> 例外をthrow でした。 DTDを使った妥当性エラーのときは、errorが呼び出されるようです。 ErrorHandlerを継承した、独自のエラーハンドラークラスを実装して、 errorのときも、例外をthrowするようにしました。そして、そのクラスを パーサにセットするようにしました。 ここでまた、質問なのですが、 errorメソッドは、DTDを使った妥当性エラーの検出以外でもよばれますか?? DTDを使った妥当性エラーの検出のみのON/OFF の切替は可能なのでしょうか? よろしくお願いします。 |
|
投稿日時: 2006-07-21 14:54
エンティティ参照の エラーは error になるかも。
parser->setFeature(XMLUni::fgSAX2CoreValidation, true); バリfalseにすれば DTD検証off になりませんか? |
1