KotlinでJAXB

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

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

コメントを残す

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

CAPTCHA