「Java」JAXB を使ってみる

JAXB を使ってみたので、その時のメモ。
以下のページにまとめられていたので、それらを参考にさせていただきました。
Java技術最前線 - 「Java SE 6完全攻略」第73回 JAXB その1:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080530/305406/?ST=develop&P=1

手順としては、以下の感じですかね。
1. スキーマを作成する
2. 作成したスキーマから Java クラスへバインドする
3. マーシャル/アンマーシャルする


1. スキーマを作成する
上記 Web ページにあるように、以下のような "persons.xsd" を作成する。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0"
    targetNamespace="http://xml.javainthebox.net" 
    xmlns:tns="http://xml.javainthebox.net"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
  <xs:element name="persons">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:person" 
                    minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 
  <xs:element name="person">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="age" type="xs:int"/>
      <xs:attribute name="sex" type="tns:sex"/>
    </xs:complexType>
  </xs:element>
 
  <xs:simpleType name="sex">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MALE"/>
      <xs:enumeration value="FEMALE"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>


2. 作成したスキーマから Java クラスへバインドする
xjc コマンドを使用して、上記スキーマから Java クラスへバインドする。

xjc persons.xsd

すると、xml\javainthebox\net 配下に、Persons.java やら Person.java やらが生成されていることが確認できる。


3. マーシャル/アンマーシャルする

  • マーシャル
import net.javainthebox.xml.*;
import javax.xml.bind.*;
import java.io.*;
import java.util.*;

class MarshallerSample {
	public MarshallerSample() {
        try {
            JAXBContext context = JAXBContext.newInstance("net.javainthebox.xml");
            
            Persons persons = new Persons();
        	List<Person> list = persons.getPerson();
        	
        	Person p1 = new Person();
        	p1.setName("hoge");
        	p1.setAge(21);
        	p1.setSex(Sex.MALE);
        	
        	Person p2 = new Person();
        	p2.setName("uga");
        	p2.setAge(30);
        	p2.setSex(Sex.FEMALE);
        	
        	list.add(p1);
        	list.add(p2);
        	
        	Marshaller marshaller = context.createMarshaller();
        	marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT , true);
        	marshaller.marshal(persons, new FileOutputStream("output.xml"));

        } catch (JAXBException e) {
        	e.printStackTrace();
        } catch (FileNotFoundException e) {
        	e.printStackTrace();
        }
    }
	
	public static void main(String[] args) {
		new MarshallerSample();
	}
}

実行すると "output.xml" が出力される

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
    <person name="hoge" age="21" sex="MALE"/>
    <person name="uga" age="30" sex="FEMALE"/>
</persons>
  • アンマーシャル
import net.javainthebox.xml.*;
import javax.xml.bind.*;
import java.io.*;

class UnMarshallerSample {
	public UnMarshallerSample() {
        try {
            JAXBContext context = JAXBContext.newInstance("net.javainthebox.xml");
            
            Unmarshaller unmarshaller = context.createUnmarshaller();
 
            File file = new File("input.xml");
 
            Object obj = unmarshaller.unmarshal(file);
            Persons artists = (Persons)obj;
  
            java.util.List<Person> p = artists.getPerson();
            for (Person person: artists.getPerson()) {
                System.out.printf("%s\tAge: %2d Sex: %s%n", person.getName(), person.getAge(), person.getSex());
            }

        } catch (JAXBException e) {
        	e.printStackTrace();
        }
    }
	
	public static void main(String[] args) {
		new UnMarshallerSample();
	}
}

入力である "input.xml" は、以下の感じ。

<persons>
  <person name="Neil Young" age="62" sex="MALE" />
  <person name="Bob Dylan" age="67" sex="MALE" />
  <person name="Joni Mitchell" age="65" sex="FEMALE" />
</persons>

実行すると、コンソールに以下の出力がある。

Neil Young      Age: 62 Sex: MALE
Bob Dylan       Age: 67 Sex: MALE
Joni Mitchell   Age: 65 Sex: FEMALE


ほとんど、冒頭の Web ページの内容を参考にさせていただいた感じですが、ひとまずできました。

以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 7