KotlinでJAXB
Kotlinで作成しているツールでXMLの読み書きをしたい。
ネットで調べても、Kotlinで便利なXML Parserが見つからなかった。
しかし、KotlinはJavaなのだから、Javaで便利なJAXBが使えるのではないか。
XML出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import javax.xml.bind.JAXB import javax.xml.bind.annotation.XmlElement import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement class Person( @XmlElement(name = "Name") var name: String, @XmlElement(name = "Age") var age: Int) { constructor() : this("no name", -1) } @XmlRootElement(name="ClassRoom") class Root(name: String, age: Int) { var teacher = Person() @XmlElementWrapper(name="StudentList") @XmlElement(name="Student") val persons = mutableListOf<Person>() init { teacher.name = name teacher.age = age } constructor() : this("no teacher", -1) } fun main(args: Array<String>) { val r = Root("Ishii", 40) r.persons.add(Person("Student 01", 20)) r.persons.add(Person("Student 02", 21)) r.persons.add(Person("Student 03", 22)) r.persons.add(Person("Student 04", 23)) r.persons.add(Person("Student 05", 24)) JAXB.marshal(r, java.io.File("work_out.xml")) println("OK!") } |
クラスの定義が容易なKotlinなので、XMLのデータクラス作成が楽。
XML入力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | fun main(args: Array<String>) { val xml = """ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ClassRoom> <teacher> <age>50</age> <name>Tokita</name> </teacher> <StudentList> <Student> <age>30</age> <name>Student 301</name> </Student> <Student> <age>31</age> <name>Student 302</name> </Student> </StudentList> </ClassRoom> """.trimIndent() xml.reader().use { val r2 = JAXB.unmarshal(it, Root::class.java) println("Teacher name[${r2.teacher.name}] age[${r2.teacher.age}]") println("Students") r2.persons.forEach { println(" Student name[${it.name}] age[${it.age}]") } } } |
読み込みも簡単。
まとめ
JAXBで読み書きしやすいXMLは、ある程度限られているので、
これで万能とは言えないが、シンプルなXMLはこれで十分対応可能なようだ。
ちなみに、Java 8 + Kotlin 1.2.31で実行。
Java 9だと、Jigsawの関係で、JAXBを使うために–add-modulesする必要がある。
1 2 | $ kotlinc -Xadd-modules=java.xml.bind KotlinJaxb.kt -d KotlinJaxb.jar -include-runtime $ java --add-modules java.xml.bind -jar KotlinJaxb.jar |
kotlincの引数に-Xadd-modulesなんて言うのがあるとは。
同じタグの記事
- Kotlin 1.2.31がいつの間にかリリースされていた
- Kotlin1.2.50がリリースされていた
- Kotlinで$(ドルマーク)を出力する
- Kotlinを使ってみた
- Kotlin今日の発見 2018年8月3日
- Kotlin再発見
同じカテゴリの記事