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が一度も登場していません。このあたりを併せて次回に解説しようと思います。