備忘録

備忘録

KotlinでXMLファイルの読み込み、書き込みを行う方法

Ⅰ. はじめに

タイトルの通り「KotlinでXMLファイルの読み込み、書き込みを行う方法」です。

この記事でサンプルとして利用するXMLファイルは以下の通りです。
input.xml

<?xml version='1.0' encoding='utf-8' standalone='no' ?>
<map>
    <string name="name001">value001</string>
    <string name="name002">value002</string>
    <string name="name003">value003</string>
</map>

Ⅱ. dom4j を利用する方法

サンプルプログラム

build.gradle

dependencies {
  compile 'jaxen:jaxen:1.1.6'
  compile 'org.dom4j:dom4j:2.1.1'
}

Main.kt

import org.dom4j.io.SAXReader
import java.io.File
import java.io.FileWriter

fun main(args: Array<String>) {
  val document = SAXReader().read(File("input.xml"))
  val nodes = document.selectNodes("/map/string")
  for (node in nodes) {
    println("${node.name}, ${node.valueOf("@name")}, ${node.stringValue}")

    node.text = "123"
  }

  val writer = FileWriter("out.xml")
  document.write(writer)
  writer.close()
}

実行結果

string, name001, value001
string, name002, value002
string, name003, value003

out.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<map>
    <string name="name001">123</string>
    <string name="name002">123</string>
    <string name="name003">123</string>
</map>

Ⅲ. javax.xml を利用した方法

サンプルプログラム

Main.kt

import org.w3c.dom.NodeList
import java.io.File
import java.io.StringWriter
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.TransformerFactory
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
import javax.xml.xpath.XPathConstants
import javax.xml.xpath.XPathFactory

fun main(args: Array<String>) {

  val documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
  val document = documentBuilder.parse(File("input.xml"))

  val xPath = XPathFactory.newInstance().newXPath()
  val nodes = xPath.evaluate("/map/string", document, XPathConstants.NODESET) as NodeList

  for (i in 0 until nodes.length) {
    val node = nodes.item(i)
    val nameAttributeValue = node.attributes.getNamedItem("name").nodeValue

    println("${node.nodeName}, $nameAttributeValue, ${node.textContent}")
    node.textContent = "123"
  }

  // write
  val writer = StringWriter()
  val transformer = TransformerFactory.newInstance().newTransformer()
  transformer.transform(DOMSource(document), StreamResult(writer))
  File("out.xml").writeText(writer.toString())
}

実行結果

string, name001, value001
string, name002, value002
string, name003, value003

out.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<map>
    <string name="name001">123</string>
    <string name="name002">123</string>
    <string name="name003">123</string>
</map>