目次へ

2005.12.20 株式会社四次元データ 宮澤了祐

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」が渡されます。

 

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp