倭マン's BLOG

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

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

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