Ⅰ. はじめに
タイトルの通り「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>