KotlinでJAXB

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 = """



50
Tokita



30
Student 301


31
Student 302



""".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なんて言うのがあるとは。

同じタグの記事
同じカテゴリの記事

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA