- PR -

Xerces C++ SAX DTDを使った妥当性検証について

1
投稿者投稿内容
かず
会議室デビュー日: 2006/07/18
投稿数: 6
投稿日時: 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;
}

以上です。
よろしくお願いします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-07-19 11:52
HandlerBase クラスは、DocumentHandler インタフェースのほか、ErrorHandler、DTDHandler、EntityResolver の各インタフェースを実装し、それらにデフォルトの定義を与えています。
http://hp.vector.co.jp/authors/VA024451/cppdocuments/xercesc/startup.html

先に、、ErrorHandler、で握りつぶされているかも。
かず
会議室デビュー日: 2006/07/18
投稿数: 6
投稿日時: 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メソッドのみ
オーバーライドしています。

以上をご参考によろしくお願いします。
情報の不足等ございましたら、お知らせください。

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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/18
投稿数: 6
投稿日時: 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 の切替は可能なのでしょうか?

よろしくお願いします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-07-21 14:54
エンティティ参照の エラーは error になるかも。

parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
バリfalseにすれば DTD検証off になりませんか?
1

スキルアップ/キャリアアップ(JOB@IT)