我是Kotlin的新手,我正尝试将用Groovy编写的简单xml文件合并任务转换为Kotlin。
在Gradle Groovy DSL中,我可以合并两个xml文件,如下面的代码所示,如何在Kotlin中完成相同的工作?
下面的mergeXml将venture.xml和order.xml文件都合并为ventory.xml文件。
我有2个.xml文件,其内容如下:
inventory.xml
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car>GM</car>
<car>Ford</car>
</cars>
order.xml
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car>Acura</car>
<car>Honda</car>
</cars>
plugins {
id 'org.springframework.boot' version '2.1.4.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = '1.8'
ext.libraries = [
frameworkLibs: [
'org.springframework.boot:spring-boot-starter-data-redis',
'org.springframework.boot:spring-boot-starter-web',
'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1',
'org.springframework.kafka:spring-kafka'
],
testLibs: [
'org.springframework.boot:spring-boot-starter-test',
'org.springframework.kafka:spring-kafka-test'
],
sqlLibs: [
'org.postgresql:postgresql'
]
]
allprojects {
group = 'com.example'
version = '0.0.1-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation libraries.frameworkLibs
runtimeOnly libraries.sqlLibs
testImplementation libraries.testLibs
}
}
// How to convert following code into Kotlin?
task mergeXml {
final inventory = new File("$rootDir/src/main/resources/inventory.xml")
final inventoryContent = inventory.getText()
final order = new File("$rootDir/src/main/resources/order.xml")
final orderContent = order.getText()
doLast {
def rootNode = new XmlParser().parseText(inventoryContent)
def printWriter = new PrintWriter(inventory)
def xmlNodePrinter = new XmlNodePrinter(printWriter)
new XmlParser().parseText(orderContent).children().each { rootNode.append(it) }
printWriter.print(inventoryContent.split("(?=<cars)")[0])
xmlNodePrinter.print(rootNode)
}
}
我正在寻找使用Kotlin在stock.xml文件中覆盖的以下结果。
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car>
GM
</car>
<car>
Ford
</car>
<car>
Acura
</car>
<car>
Honda
</car>
</cars>
答案 0 :(得分:0)
您需要在kotlin中重新实现合并逻辑:
它看起来应该像这样:
fun mergeXmlFiles(file1: File, file2: File) {
val text1 = file.readText()
...
val rootNode = XmlParser().parseText(inventoryContent)
val printWriter = PrintWriter(inventory)
val xmlNodePrinter = XmlNodePrinter(printWriter)
...
}
然后您可以从构建脚本中使用自定义功能:
tasks {
val mergeXml by creating {
doLast {
mergeXmlFiles(File(...), File(...))
}
}
}
答案 1 :(得分:0)
我知道了。它不像Groovy那样精巧或直观(需要大量工作)。请告知是否有更好的方法。
/*
* This file includes utilities for processing XML in Kotlin DSL
*
*/
import javax.xml.parsers.DocumentBuilderFactory;
import org.xml.sax.InputSource
import java.io.StringReader
import java.io.File
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
object XmlUtility {
fun mergeSaveXml(orgXml: String, newXml: String, filePath: String) {
val finalDocument = mergeXml(orgXml, newXml)
val transformerFactory = TransformerFactory.newInstance()
val transformer = transformerFactory.newTransformer()
val domSource = DOMSource(finalDocument)
val streamResult = StreamResult(File(filePath))
transformer.transform(domSource, streamResult)
}
fun mergeXml(originalContent:String, newContent: String): Document {
val dbFactory = DocumentBuilderFactory.newInstance()
val dBuilder = dbFactory.newDocumentBuilder()
val xmlOrgInput = InputSource(StringReader(originalContent))
val xmlOrgDoc = dBuilder.parse(xmlOrgInput)
val xmlOrgEle = xmlOrgDoc.getDocumentElement()
val xmlNewInput = InputSource(StringReader(newContent))
val xmlNewgDoc = dBuilder.parse(xmlNewInput)
val xmlNewEle = xmlNewgDoc.getDocumentElement()
val xmlNewNde = xmlNewEle.getChildNodes()
for (i in 0 until xmlNewNde.length) {
val xmlNode = xmlNewNde.item(i)
if (xmlNode.nodeType == Node.ELEMENT_NODE) {
val xmlImportedNode = xmlOrgDoc.importNode(xmlNode, true)
xmlOrgEle.appendChild(xmlImportedNode)
}
}
return xmlOrgDoc
}
}
task mergeXml {
final inventory = new File("$rootDir/src/main/resources/inventory.xml")
final inventoryContent = inventory.getText()
final order = new File("$rootDir/src/main/resources/order.xml")
final orderContent = order.getText()
doLast {
mergeSaveXml(inventoryContent, orderContent, "$rootDir/src/main/resources/inventory.xml")
}
}