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

