簡単な入れ子構造を扱う #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の世界の住人なのだ。何にせよ問題なく実行することはできる。