JAXBで日本語タグも使えました
JAXB(Java Architecture for XML Binding)で、日本語のタグも使えることを動作確認してみました。フツーに使えますね。
ポイントは、変換元/先オブジェクトのクラス定義で、@XmlRootElement、@XmlElementアノテーションを付けることですね。
文字コードも指定できました。
オブジェクト→XML変換
変換元クラス
@XmlRootElement(name = "人データ") public class PersonJp { // Getter/Setterを省略して、publicにしてあります。 @XmlElement(name = "名前") public String name; @XmlElement(name = "年齢") public int age; }
オブジェクト→XML変換処理
// 入力オブジェクト PersonJp person = new PersonJp(); person.name = "山田 太郎"; person.age = 20; // 出力先 StringWriter actual = new StringWriter(); // 実行 JAXB.marshal(person, actual); // 期待値 String expected = "" // + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" // + "<人データ>\n" // + " <名前>山田 太郎</名前>\n" // + " <年齢>20</年齢>\n" // + "</人データ>\n" // ; // 検証 assertThat(actual.toString(), is(expected));
XML→オブジェクト変換
XML→オブジェクト変換処理
// 入力XML String input = "" // + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" // + "<人データ>\n" // + " <名前>山田 太郎</名前>\n" // + " <年齢>20</年齢>\n" // + "</人データ>\n" // ; StringReader sr = new StringReader(input); // 実行 PersonJp actual = JAXB.unmarshal(sr, PersonJp.class); // 検証 assertThat(actual.name, is("山田 太郎")); assertThat(actual.age, is(20));
文字コードを指定して変換
XMLファイルをシフトJISで作成したい場合は、次のように文字コードを指定することで、作成できました。
オブジェクト→XML変換処理
// 入力オブジェクト PersonJp person = new PersonJp(); person.name = "山田 太郎"; person.age = 20; // 出力先 StringWriter actual = new StringWriter(); // Marshallerインスタンス作成 // 文字コードにシフトJISを指定。 // XMLを人が読みやすいようにフォーマットする。 // ※改行コードはLF(0x0A)のみの模様。 JAXBContext context = JAXBContext .newInstance(person.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "Shift_JIS"); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 実行 marshaller.marshal(person, actual); // 期待値 URL url = getClass().getResource( "/jp/co/tryjava/jaxb/person_sjis.xml"); File file = FileUtils.toFile(url); String expected = FileUtils.readFileToString(file, "Shift_JIS"); // 検証 assertThat(actual.toString(), is(expected));
XML→オブジェクト変換処理
// 入力XML URL url = getClass().getResource( "/jp/co/tryjava/jaxb/person_sjis.xml"); File file = FileUtils.toFile(url); String input = FileUtils.readFileToString(file, "Shift_JIS"); StringReader sr = new StringReader(input); // 実行 PersonJp actual = JAXB.unmarshal(sr, PersonJp.class); // 検証 assertThat(actual.name, is("山田 太郎")); assertThat(actual.age, is(20));
参考ページ
・Java - JAXB使い方メモ - Qiita
※非常に分かりやすくまとまっていました!