KotlinでJAXB
Kotlinで作成しているツールでXMLの読み書きをしたい。
ネットで調べても、Kotlinで便利なXML Parserが見つからなかった。
しかし、KotlinはJavaなのだから、Javaで便利なJAXBが使えるのではないか。
XML出力
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
init {
teacher.name = name
teacher.age = age
}
constructor() : this("no teacher", -1)
}
fun main(args: Array
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入力
fun main(args: Array
val xml = """
""".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する必要がある。
$ 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再発見
コメントを残す