読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Simpleライブラリの検証(4)

Java XML

ざっくりと試してみたSimpleライブラリ。

いろいろと気になる点もあったので、ざくっと検証してみる。の続き。

Elementアノテーションのdata要素

JavaDocを見たときに気づいたElementアノテーションのdata要素。説明を見ると、CDATAセクションとして書き出すのかどうかという指定のようだが、どのようになるのかを見てみる。
CDATAセクションは、次のように書く。

<![CDATA[・・・]]>

「・・・」の部分には任意のテキストが入るのだが、例外として、"]]>"という文字列を含んではいけないという規約がある。

普通に試しても面白くないので、この規約どおりの出力になるかどうかを見てみることにする。
まずは検証用コード。

import java.io.File;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("=== serialize ===");
		try {
			Serializer serializer = new Persister();
			TextData textData = newTextData("<root><![CDATA[hogehoge]]></root>");

			File result = new File("data/text.xml");
			System.out.println("      " + result);
			serializer.write(textData, result);
		} catch (Exception e) {
			e.printStackTrace(System.out);
		}
		System.out.println("=== deserialize ===");
		try {
			Serializer serializer = new Persister();

			File source = new File("data/text.xml");
			System.out.println("      " + source);
			TextData textData = serializer.read(TextData.class, source);
			dumpTextData(textData);
		} catch (Exception e) {
			e.printStackTrace(System.out);
		}
	}

	private static TextData newTextData(String text) {
		TextData textData = new TextData();
		textData.setText(text);
		return textData;
	}

	private static void dumpTextData(TextData textData) {
		System.out.println("        text:  " + textData.getText());
	}

}

で、TextDataクラスは次のとおり。

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root
public class TextData {

	@Element(data=true)
	private String text;

	public String getText() {
		return this.text;
	}

	public void setText(String text) {
		this.text = text;
	}

}

で、これを実行してみる。

=== serialize ===
      data\text.xml
=== deserialize ===
      data\text.xml
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2,52]
Message: end tag name 'root' must be the same as start tag 'text'
	at com.bea.xml.stream.MXParser.parseEndTag(MXParser.java:2191)
	at com.bea.xml.stream.MXParser.nextImpl(MXParser.java:1763)
	at com.bea.xml.stream.MXParser.next(MXParser.java:1333)
	at com.bea.xml.stream.XMLEventReaderBase.parseSome(XMLEventReaderBase.java:200)
	at com.bea.xml.stream.XMLEventReaderBase.peek(XMLEventReaderBase.java:150)
	at org.simpleframework.xml.stream.NodeReader.readValue(NodeReader.java:208)
	at org.simpleframework.xml.stream.InputElement.getValue(InputElement.java:193)
        :

‥だめでした。一応、シリアライズの際に出力されたファイルを見てみると‥

<textData>
   <text><![CDATA[<root><![CDATA[hogehoge]]></root>]]></text>
</textData>

えと‥テキストに含まれる"]]>"がひとつのCDATAセクションに入ってしまっているので、そこでCDATAセクションが終わってしまう。
CDATAセクションに関してここまで考えているソフトってないんだろうか‥