「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 ページの内容を参考にさせていただいた感じですが、ひとまずできました。
以上です。