簡単な入れ子構造を扱う #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」と言われてはいてもさすがにこれは寂しい。