簡単な入れ子構造を扱う #6
RELAX NGの短縮記法からJAXBでXMLデータを扱うということならわざわざxjcを介するまでもない。
Relaxer自身にJAXBのやり方で利用できるようにソースを生成してくれるオプションがある。
relaxer -dir.package -java.package:school -java.jaxb school.rnc
利用側のソースはSchoolUser.javaと基本的に同じであり、XMLデータのオブジェクト化のみがJAXBの流儀になる。
SchoolUser2.javaと同様にJAXBContextのインスタンスを得るが、こちらはSchoolFactory#createContext()を使う。
SchoolUser3.java
import java.io.File; import javax.xml.bind.JAXBException; import school.*; public class SchoolUser3 { public static void main(String[] args) throws JAXBException { for (SchoolGrade sg: ((School)(SchoolFactory.createContext(null, null).createUnmarshaller().unmarshal(new File("school.xml")))).getSchoolGrade()) { System.out.println("[" + sg.getName() + "]"); for (SchoolGradeGroup sgg : sg.getSchoolGradeGroup()) { System.out.println(" [" + sgg.getName() + "]"); for (SchoolGradeGroupStudent sggs : sgg.getSchoolGradeGroupStudent()) { System.out.println(" [" + sggs.getName() + ", " + sggs.getHeight() + "cm]"); } } } } }
これをコンパイルおよび実行するにはRelaxerの配布物に含まれるRelaxerOrg.jarへクラスパスを通す必要がある。
xjcのように注釈を埋め込んで実行時に参照・処理をする代わりに、RelaxerOrg.jarで面倒を見る機能を提供している。
コンパイルでは例によってRelaxerの生成物に対して警告が出るが仕方ない。
未チェック警告に関してだけならRelaxerの生成物だけ-source 1.4でコンパイルすれば消えることは消える。
Relaxerは1.4の世界の住人なのだ。何にせよ問題なく実行することはできる。