kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

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
 ※非常に分かりやすくまとまっていました!