xml - 如何在 Gradle Kotlin 中合并两个 .xml 文件?
问题描述
我是 Kotlin 的新手,我正在尝试将一个用 Groovy 编写的简单 xml 文件合并任务转换为 Kotlin。
在 Gradle Groovy DSL 中,我可以合并两个 xml 文件,如下面的代码所示,我如何在 Kotlin 中完成相同的操作?
下面的mergeXml 将inventory.xml 和order.xml 文件合并到inventory.xml 文件中。
我有 2 个包含以下内容的 .xml 文件:
库存.xml
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car>GM</car>
<car>Ford</car>
</cars>
订单.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 在inventory.xml 文件中覆盖的以下结果。
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car>
GM
</car>
<car>
Ford
</car>
<car>
Acura
</car>
<car>
Honda
</car>
</cars>
解决方案
您需要在 kotlin 中重新实现合并逻辑:
- 使用val而不是def (变量)
- 您不需要new来调用类的构造函数(创建类)
- 使用适当的 Kotlin 函数来替换 groovy 代码(例如readText()而不是getText()来将文件读取到字符串。
- ...
它应该看起来像:
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(...))
}
}
}
推荐阅读
- html - li 元素上方不需要的空格
- javascript - 引导模式后页面正在重新加载(“显示”)
- reactjs - 如何使用 google-maps-react 在信息窗口中添加按钮?
- node.js - 如何在 Node.js 中使用 Promises 迭代文件
- sql-server - 可连接多次 abc
- javascript - 循环中的单击功能
- java - java.lang.IllegalArgumentException:输入 == 空!在 javax.imageio.ImageIO.read(未知来源)
- angular - 将 Nebular 安装到我现有的 Angular 项目中的困难
- c - 在 vs2017 上编译 C 和 asm
- python - 根据 Python 2.7 中的正则表达式匹配重新排序列表?