Java で XML 文書を扱う 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 化すると、同じ文字列が多量に出てくる場合に、メモリを余分に消費してパフォーマンスを向上させます。