倭マン's BLOG

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

XML 文書のフォーマット 入力編

JavaXML 文書を扱う API がいろいろありますが、入出力の際に指定できるフォーマットが各 API でいろいろあるので、チョット整理しておきましょう。 JDOM の Format や dom4j の OutputFormat は次回

今回は読み込みの際に処理を行う「入力編」。 各 API で対象としている API バージョンとクラスは以下の通り:

API version クラス
SAX Java SE 6 (javax.xml.parsers) SAXParserFactory, SAXParser
DOM Java SE 6 (javax.xml.parsers) DOMBuilderFactory, DOMBuilder
StAX Java SE 6 (javax.xml.stream) XMLInputFactory, XMLStreamReader, XMLEventReader
JDOM JDOM 1.1 (org.jdom.input) SAXBuilder
dom4j dom4j 2.0 (org.dom4j.io) SAXReader (一部 SAXContentHandler, DOMSAXContentHandler も含む)
XOM XOM 1.1 (nu.xom) Builder

XML ツリー構造


まずは XML ツリーの構造に関するプロパティです。 全て boolean 値のプロパティです。 表を見る際の注意点は

  • プロパティ名は概ね JavaBeans としてのプロパティを載せています*1
  • 」は切り替え可能
  • T」は true に固定された挙動を示し、切り替えできない場合です(実装によっては Feature プロパティによって切り替えができる場合もあります。)
  • ○の添字の T/F はデフォルト値(JavaDoc に書いていない場合は省略しています。)
  • 」は似たような機能がサポートされている

です。 説明は簡潔に書いているので不正確です。 後日いくつかの挙動をサンプルと共に示す予定。

プロパティ名 説明 SAX DOM StAX JDOM dom4j XOM
namespaceAware 名前空間を解析 F F T T T T
coalescing CDATA をテキストへ展開 F F (4)(5) T
ignoringElementContentWhitespace 無視できる空白を無視 F F(2) (4)(6)
ignoringBoundaryWhitespace 空白文字のみのテキストを無視 F(2)
ignoringComments コメントを無視 F (4)(7)
replacingEntityReferences 実体参照を展開 T(1) T T(2)(3) T
supportingExternalEntities 外部実体のサポート
supportDTD DTD のサポート T
includeInternalDTDDeclarations 内部 DTD 宣言を含めるか
includeExternalDTDDeclarations 外部 DTD 宣言を含めるか
  • (1) expandEntityReferences としてサポート。
  • (2) SAXHandler もサポート。
  • (3) expandEntities としてサポート。
  • (4) SAXContentHandler, DOMSAXContentHandler もサポート。
  • (5) mergeAdjacentText としてサポート。 coalescing とは少し挙動が違う模様。
  • (6) stripWhitespaceText としてサポート。 ignoringElementContentWhitespace とは少し挙動が違う模様。
  • (7) ignoreComments としてサポート。

周辺仕様や実装に関連するプロパティ


表の見方は上記と同じ。

プロパティ名 説明 SAX DOM StAX JDOM dom4j XOM
feature 実装に依存した設定 (boolean 値) (2)
property 実装に依存した処理 (Object 値) (1)
validating DTD による妥当性検証 F F F (3) (4)
schema javax.xml.validation API による妥当性検証 (Schema オブジェクト)
xIncludeAware XInclude を解決 F F (5)
reuseParser パーサオブジェクトを再利用 T
stringInternEnabled String オブジェクトを intern 化*2 T
  • (1) attribute としてサポート。
  • (2) property とともにサポート。
  • (3) validation としてサポート。
  • (4) Builder オブジェクトのコンストラクタで指定。
  • (5) Document オブジェクトを構築した後、XIncluder#resolver() メソッドによって解決。

*1:プロパティ値を取得するためには1文字目を大文字にしてその前に "is" (boolean 値の場合)または "get" (その他の場合)を付加した getter メソッドを、プロパティ値を設定するためには同様に "set" を付加した setter メソッドを用います。 例えば、プロパティ "namespaceAware" に対しては getter メソッドは isNamespaceAware()、setter メソッドは setNamespaceAware(boolean) となります。

*2:String オブジェクトを intern 化すると、同じ文字列が多量に出てくる場合に、メモリを余分に消費してパフォーマンスを向上させます。