倭マン's BLOG

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

XML ノードの型階層を理解する

今回は dom4j で実現している、XML 文書のオブジェクト・モデルを見ていきましょう(一覧)。

XML 文書には要素やテキストなど、いろいろなノードがあります。 それらを表すインターフェースは org.dom4j.Node を頂点とする階層構造をなしています。 これを図示すると下図のようになります(全て org.dom4j パッケージ内のインターフェース、クラスなので、パッケージ名は省略します):

f:id:waman:20070919032239p:image

Namespace のみ、具象クラスです。 それ以外は全てインターフェースです。

図の見方を少々。 矢印付の黄色い領域は、その中のインターフェースが全て矢印の指しているインターフェースを拡張していることを示しています。 例えば、Branch は Node を拡張し、Element は Branch を拡張します。 当然、Element は Node を拡張しています。

以下で、主要な型について getter メソッドを参考に見ていきましょう。 全ての型、全ての getter メソッドを挙げているわけではありません:

  • Node
  • Branch
  • Document
  • Element
  • Namespace
  • Attribute
  • Text

♪Node♪


これは XML 文書内の全種類ノードが実装するインターフェースです。 このインターフェースを実装しているオブジェクトから取得出来るモノは以下の通り:

取得できるモノ getter メソッド 備考
ノードの名前 String getName() Element, Attribute → ローカル名
Document, Text → null。
short getNodeType()
親ノード Element getParent() Document → null
親ノードがない → null
テキスト String getText() Document → ""
Element → 子要素を取り除いたテキスト

♪Branch♪


これは、子ノードを持つノードが実装するべきインターフェースです。 具体的な拡張インターフェースは Document と Element です。 子ノードへの Accessor メソッドが定義されています:

取得できるモノ getter メソッド 備考
子ノード Node node(int) content() によって、子ノードを List として取得できます*1

content() によって返されるリストに含まれている Node の型は、Branch のサブクラスの型(すなわち Document か Element か)によって決まっています:

Branch に可能なもの
Element, Comment, ProcessingInstruction (Document にはただ1つの Element のみ可能。)
Element にのみ可能なもの
Namespace, Text, CDATA, Entity

♪Document♪


XML 文書を表すインターフェースです。 XML 文書についての情報と、ルート要素*2への Accessor メソッドが定義されています:

取得できるモノ getter メソッド
XML 文書のエンコーディング String getXMLEncoding()
文書型 DocumentType getDocType()
ルート要素 Element getRootElement()

♪Element♪


要素を表すインターフェースです。 タグ名、属性、子要素などに対する Accessor メソッドが定義されています:

取得できるモノ getter メソッド 備考
QName*3 QName getQName()
宣言されている
名前空間
List declaredNamespaces()
属性 Attribute attribute() attributes() によって、属性を List として取得できます。
子要素 Element element() elements() によって、子要素を List として取得できます。

♪Namespace♪


名前空間を表すクラスです。 接頭辞と名前空間 URI に対する Accessor メソッドが定義されています:

取得できるモノ getter メソッド
接頭辞 String getPrefix()
名前空間 URI String getURI()

♪Attribute♪


属性を表すインターフェースです。 属性名と属性値に対する Accessor メソッドが定義されています:

取得できるモノ getter メソッド
QName QName getQName()
属性の値 String getValue()

♪Text♪


テキストを表すインターフェースです。 Node インターフェースの getText() メソッドを使用してテキストを取得できます。

*1:content() メソッドによって取得された List を変更すると、もとのノードも変更されるので、使う際には注意が必要です。

*2:文書内で最も外側にある要素。 どんな XML 文書もルート要素は1つだけしかもてません。

*3:名前空間が設定された名前