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