倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

XMLEventFactory (7) : その他 (2) DTD, EntityReference

今回は DTD実体参照

  • DTD
  • EntityReference

正直あまり使わないので、サラッと流します(というか、サンプルは示しません)。

DTD


DTD イベントを生成するメソッドは XMLEventFactory#createDTD() です。

createDTD(String dtd)

引数は DTD を表す文字列。

DTD イベントと EntityDeclaration, NotationDeclaration イベント

DTD イベントのインターフェース javax.xml.stream.events.DTD の仕様をジェネリクスを用いて書くと次のような感じ(コメントは勝手に付けてます):

public interface DTD {

    /** 
     * 文書型宣言を文字列として返します。
     */
    String getDocumentTypeDeclaration();

    /** 
     * 実体宣言(内部、外部どちらも含む)のリストを返します。
     * リストの要素は javax.xml.stream.events.EntityDeclaration オブジェクト。
     */
    List<EntityDeclaration> getEntities();

    /** 
     * 記法宣言のリストを返します。
     * リストの要素は javax.xml.stream.events.NotationDeclaration オブジェクト。
     */
    List<NotationDeclaration> getNotations();

    /** 
     * DTD を何らかの実装を用いてオブジェクトとして返します・・・
     */
    Object getProcessedDTD();
}

EntityDeclaration, NotationDeclaration はどちらも XMLEvent インターフェースを拡張した、XML イベント・インターフェースです。 ただし、どちらも XMLEventFactory に生成メソッドが定義されていおらず、インスタンスを取得するには DTD イベントに定義されたこのメソッドを用いなければいけなさそうです(自分で実装を作成するなら別ですが)。

EntityReference


EntityReference イベントを生成するメソッドは XMLEventFactory#createEntityReference() です。

createEntityReference(String name, EntityDeclaration declaration)

引数は

  • 実体参照の名前(&xxxx; の「xxxx」の部分)
  • 実体宣言を表す EntityDeclaration オブジェクト

です。 第2引数の EntityDeclaration オブジェクトDTD オブジェクトに定義されているメソッド DTD#getEntities() から取得するようです(それ以外に EntityDeclaration オブジェクトを取得もしくは生成するメソッドが見当たらん)。

ちなみに、XMLStreamReader もしくは XMLEventReader で XML 文書を解析している際、プロパティ「javax.xml.stream.isReplacingEntityReferences」の値を false にしなければ EntityReference イベントが報告されることはありません。