JAXBの簡単な解説(1)

JavaとXML間のバインディングを行うJAXB

JavaオブジェクトからXMLへ変換したい、またはXMLからJavaオブジェクトへ変換したい、ということはよくあるものです。

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

JAXBの考え方

まずはJAXBの考え方を俯瞰しておきます。

図のように、JavaクラスとXML Schemaとが対応するものと考えます。言われてみればもっともな話で、実体としてJavaオブジェクト・XML文書があり、その雛形としてJavaクラス・XML Schemaがあるということですね。

ここから分かる通り、JAXBの出発点はJavaクラスかXML Schemaになります。どちらから始めても実装可能です。

JavaオブジェクトからXMLへの変換

まずはごくごく単純なデータ構造として「会社」と「従業員」を使うことにし、

会社(従業員*)
従業員(名前,給料)

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

コメントを残す