前回に続き、今回は XML 文書のフォーマットの「出力編」。 SAX, DOM はナシ。 代わりに javax.xml.transform パッケージ (TrAX API) を扱います。
各 API での対象となるクラスは以下の表の通り:
| API | version | クラス |
|---|---|---|
| transform | Java SE 6 | (javax.xml.transform) OutputKey |
| StAX | Java SE 6 | (javax.xml.stream) XMLOutputFactory, XMLStreamWriter, XMLEventWriter |
| JDOM | JDOM 1.1 | (org.jdom.output) Format*1 (一部 SAXOutputter, DOMOutputter を含む) |
| dom4j | dom4j 2.0 | (org.dom4j.io) OutputFormat*2 |
| XOM | XOM 1.1 | (nu.xom) Serializer |
表を見る際の注意点は
- プロパティ名は概ね JavaBeans としてのプロパティを載せています*3。
- 「○」は切り替え可能
- ○の添字の T/F はデフォルト値(JavaDoc に書いていない場合は省略しています。)
- 「△」は似たような機能がサポートされている
- 「◇」は上記の表に載せた対象となるクラス以外のクラスでサポートされている
です。 説明は簡潔に書いているので不正確です。 後日いくつかの挙動をサンプルと共に示す予定。
XML ツリー構造 -- XML 宣言・DTD・処理命令
| プロパティ名 | 説明 | transform | StAX | JDOM | dom4j | XOM |
|---|---|---|---|---|---|---|
| preserveBaseURI | ベース URI を保存するかどうか | ○F | ||||
| suppressDeclaration | XML 宣言を省くかどうか | ○(1) | △(2) | ○(3) | ○ | |
| VERSION | XML 文書のバージョンを指定する(String 値) | ○ | △(2) | |||
| omitEncoding | エンコーディング指定を省くかどうか | △(2) | ○ | ○ | ||
| encoding | エンコーディングを指定する(String 値) | ○ | △(2) | ○ | ○ | ○ |
| STANDALONE | XML 文書の standalone を指定する(String 値) | ○ | ||||
| DOCTYPE_PUBLIC | XML 文書のパブリック ID を指定する(String 値) | ○ | ||||
| DOCTYPE_SYSTEM | XML 文書のシステム ID を指定する(String 値) | ○ | ||||
| reportDTDEvents | DTD イベントを報告する | ◇(4) | ||||
| ignoreTrAXEscapingPIs | TrAXEscapingPI (?) を無視する | ○ |
- (1) OMIT_XML_DECLARATION としてサポート。
- (2) XMLStreamWriter, XMLEventWriter のメソッド startDocument() で制御できます。
- (3) omitDeclaration としてサポート。
- (4) SAXOutputter でサポート。
XML ツリー構造 -- 要素・属性・名前空間
| プロパティ名 | 説明 | transform | StAX | JDOM | dom4j | XOM |
|---|---|---|---|---|---|---|
| expandEmptyElements | 空要素の開始タグと終了タグを分離するかどうか | △(1) | ○ | ○ | ||
| newLineAfterNTags | タグを指定個数出力した後改行する改行するかを指定する | ○ | ||||
| attributeQuoteCharacter | 属性値を囲む文字 (' or ") を指定する(char 値) | ○ | ||||
| namespaceAware | 名前空間宣言を使用する | ◇(2) | ||||
| repairingNamespaces | 宣言のない名前空間などを復元する | ○ |
- (1) XMLStreamWriter では startElement(), endElement(), emptyElement() メソッドで制御できます。
- (2) SAXOutputter では reportNamespaceDeclarations, DOMOutputter では forceNamespaceAware としてサポート。 挙動はそれぞれ少し異なります。
XML ツリー構造 -- テキスト
| プロパティ名 | 説明 | transform | StAX | JDOM | dom4j | XOM | |
|---|---|---|---|---|---|---|---|
| newLineAfterDeclaration | XML 宣言の後に空行を挿入するかどうか | ○T | |||||
| newLines | 改行を行うかどうかを指定する | ○ | |||||
| indent | インデント文字を指定する(String 値、int 型) | yes/no | ○ | ○ | ○ | ||
| lineSeparator | 改行文字を指定する(String 値) | ○ | ○ | ○ | |||
| trimText | テキストをトリムするかどうかを指定する | ○(1) | ○F | ||||
| padText | 要素の前後にスペースを挿入するかどうか | ○F | |||||
| CDATA_SECTION_ELEMENT | 子テキストを CDATA セクションとして出力する要素をスペースで区切って列挙する(String 値) | △ | |||||
| maxLength | 行の最大文字数を指定する(int 型) | ○ | |||||
| unicodeNormalizationFormC | Unicode normalization を行うかどうか | ○F |
- (1) Format.TextMode で指定
その他
| プロパティ名 | 説明 | transform | StAX | JDOM | dom4j | XOM |
|---|---|---|---|---|---|---|
| MEDIA_TYPE | XML 文書のメディアタイプを指定する(String 値) | ○ | ||||
| xHTML | XHTML 文書かどうかを指定する | ○(1) | ○ |
- (1) METHOD プロパティとしてサポート。 プロパティ値としては xml, html, text のいずれかの文字列を指定。
*1:Format オブジェクトは org.jdom.output.XMLOutputter で使用します。
*2:OutputFormat オブジェクトは org.dom4j.io.XMLWriter, org.dom4j.io.XMLResult で使用します。
*3:プロパティ値を取得するためには1文字目を大文字にしてその前に "is" (boolean 値の場合)または "get" (その他の場合)を付加した getter メソッドを、プロパティ値を設定するためには同様に "set" を付加した setter メソッドを用います。 例えば、プロパティ "namespaceAware" に対しては getter メソッドは isNamespaceAware()、setter メソッドは setNamespaceAware(boolean) となります。