minato128 blog

minato128の公開メモ帳です。

DigesterでXMLの妥当性検証を行う

Digester digester = DigesterLoader.createDigester(new InputSource(is));
digester.setValidating(true);
digester.setSchema(schemaPath);
digester.parse(new StringReader(xml));

こんな風に書いて、正常にXMLからオブジェクトを作ることには成功したんだけど、わざと入力XMLを間違った書式にしてみても全然エラーが帰ってこなかった。
グーグルのおっさんに聞いてみたら、Digester/FAQにこんなのが。


Why doesn't Digester throw SAXParseException when processing bad XML?
http://wiki.apache.org/commons/Digester/FAQ
The Digester class extends org.xml.sax.helpers.DefaultHandler, and the default implementation it inherits from there is to completely ignore errors reported during parsing.
You need to implement your own subclass of org.xml.sax.ErrorHandler

MyErrorHandler eh = new MyErrorHandler();
digester.setErrorHandler(eh);

訳すとおそらくこんな感じ
「なんでDigesterは変なXML処理したときに、SAXParseExceptionを投げてくれやがらないんですかー?」
「デフォルトは構文解析エラーを無視する仕様だし。投げて欲しかったらorg.xml.sax.ErrorHandlerのサブクラスを実装してよね。」

おとなしく実装して、setErrorHandlerを書いて解決。