2005.12.20 株式会社四次元データ 宮澤了祐
SAX 3章 XML文書を読む2
- 3.1. エラー通知を受け取る
- 3.2. DTDを利用した妥当性のチェック
- 3.3. 外部エンティティの解決
- 3.4. NOTATION宣言の取得
3.3. 外部エンティティの解決
public interface EntityResolverを実装し、XMLReader.setEntityResolver(EntityResolver resolver) メソッドにより外部エンティティを利用しようとするより前に、外部エンティティを遮断することが出来ます。 またDefaultHandlerでは既にEntityResolverを実装しています。 外部エンティティ宣言が発生した場合、DefaultHandlerのresolveEntity()メソッドが呼ばれます。 以下は外部エンティティ宣言が発生した場合、ローカルのDTDファイルを読み込むサンプルです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> ... </html>
public InputSource resolveEntity(String publicId, String systemId) throws SAXException { if(publicId.equals("-//W3C//DTD XHTML 1.1//EN"){ return new InputSource("xhtml11-flat.dtd"); }else{ //SystemIdで指定されたDTDを参照します。 return null; } }
実行にはW3Cより、xhtml11-flat.dtdをダウンロードし、ローカルに保存しておく必要があります。 xhtml-flat.dtdとの整合性を調べることで、正しいXHTMLかどうかを調べることが出来ます。
3.4. NOTATION宣言の取得
DefaultHandlerのnotationDecl()メソッド及びunparsedEntityDecl()メソッドを実装することで NOTATION宣言及び解析対象外エンティティ宣言を取得することが出来ます。
<?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE root[ <!NOTATION gif PUBLIC "-//4dd //NOTATION GIF Image //EN"> <!ENTITY logo SYSTEM "http://sample.com/img/4dd.gif" NDATA gif> ]> <root> <img src="logo" /> </root>
public void notationDecl(String name, String publicId, String systemId) throws SAXException { System.out.println("NOTATION宣言"); System.out.println(" 名前:"+name); System.out.println(" PublicId:"+publicId); System.out.println(" SystemId:"+sytemId); } public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) throws SAXException { System.out.println("解析対象外エンティティ宣言"); System.out.println(" 名前:"+name); System.out.println(" PublicId:"+publicId); System.out.println(" SystemId:"+sytemId); System.out.println(" NotationName:"+notationName); }
実際に解析対象外エンティティを使用したい場合は、NOTATION宣言及び解析対象外エンティティ宣言で、宣言された名前を記録しておき、
出現した場合に外部のアプリケーション等に渡すなどの処理を行います。
以下のように出力されれば成功です。
NOTATION宣言 名前:gif PublicId:-//4dd //NOTATION GIF Image //EN SystemId:null 解析対象外エンティティ宣言 名前:logo PublicId:null SystemId:http://sample.com/img/4dd.gif NotationName:gif ...
解析対象外エンティティが使われていた場合、SAXからは属性の値として「logo」が渡されます。