JavaオブジェクトからXMLへ変換したい、またはXMLからJavaオブジェクトへ変換したい、ということはよくあるものです。
方法はいくつか考えられますが、JavaSE6 にある標準技術 JAXB (Java Architecture for XML Binding) では、この変換を手軽に実装できるようになっています。その使い方を解説しようと思います。
まずはJAXBの考え方を俯瞰しておきます。

図のように、JavaクラスとXML Schemaとが対応するものと考えます。言われてみればもっともな話で、実体としてJavaオブジェクト・XML文書があり、その雛形としてJavaクラス・XML Schemaがあるということですね。
ここから分かる通り、JAXBの出発点はJavaクラスかXML Schemaになります。どちらから始めても実装可能です。
まずはごくごく単純なデータ構造として「会社」と「従業員」を使うことにし、
会社(従業員*)
従業員(名前,給料)
とします。ありがちですいません。これをJavaクラスにするとおそらく以下のようになるでしょう。何ということはない、ごく普通のJavaクラスです。
Companyクラス
public class Company {
private List<Employee> employees;
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employeeクラス
public class Employee {
private String name;
private int salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
次に、このクラスのオブジェクトをXMLに変換するプログラムがどうなるか見てみます。
※ なお、JAXB関連のクラスは javax.xml.bind 以下のパッケージに入っています。
public class Sample1 {
public static void main(String[] args) {
// 会社
Company c = new Company();
// 2人の従業員
List<Employee> employees = new ArrayList<Employee>();
Employee e1 = new Employee();
e1.setName("taro");
e1.setSalary(1000);
employees.add(e1);
Employee e2 = new Employee();
e2.setName("hanako");
e2.setSalary(800);
employees.add(e2);
c.setEmployees(employees);
// マーシャル
JAXB.marshal(c, System.out);
}
}
特別なことは何もしていません。ただJAXB#marshal()を呼んでいるだけです。
これを実行すると、以下のような出力が得られるはずです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<company>
<employees>
<name>taro</name>
<salary>1000</salary>
</employees>
<employees>
<name>hanako</name>
<salary>800</salary>
</employees>
</company>
これで一応JavaオブジェクトからXMLへの変換はできたことになります。
出力されたXMLをよく見ると従業員の要素名が「employees」になっています。これは少し嫌なので調整したいですね。そのためにはアノテーションを使ってバインディングを変更する必要があります。
また、JavaクラスとXML Schemaとが対応すると言っておきながら、XML Schemaが一度も登場していません。このあたりを併せて次回に解説しようと思います。