簡単な入れ子構造を扱う #4

せっかくだから純正のJAXBでバインディングを行ってみる。
JDK付属のxjcにはスキーマ言語としてRELAX NGを受け付ける(はずの)オプションがある。短縮記法用もある。

$ xjc -relaxng-compact -p school school.rnc
parsing a schema...
[ERROR] syntax error: Encountered "\r" at line 1, column 17.
...snip

改行コードとしてCRLFを受け付けないらしい。改行を\u000aのみにして再実行。

$ xjc -relaxng-compact -p school school.rnc
parsing a schema...
[ERROR] datatype library "http://www.w3.org/2001/XMLSchema-datatypes" not recognized
...snip

XML Schemaのデータ型の定義を理解できないらしい。仕方がないのでとりあえずxjcを通すことだけを考える。

school2.rnc
element school {
  element grade {
    attribute name { text },
    element group {
      attribute name { text },
      element student {
        attribute name { text },
        attribute height { text }
      }+
    }+
  }+
}

やってみると、

$ xjc -relaxng-compact -p school school2.rnc
parsing a schema...
compiling a schema...
school\ObjectFactory.java
school\School.java

通った。通ったが……School.javaしか生成されていない。しかもその中身は、

School.java (extract)
...snip
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "school")
public class School {


}

見事に何もない実装がそこに。
「experimental,unsupported」と言われてはいてもさすがにこれは寂しい。