6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JAXBで日本語タグも使えました

Last updated at Posted at 2014-05-18

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;
}
変換処理
// 入力オブジェクト
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
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
 ※非常に分かりやすくまとまっていました!

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?