前回に続き、今回は 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) となります。