首页 > 解决方案 > 如何在 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>

标签: xmlgradlekotlin

解决方案


您需要在 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(...))
     }
   }
}

推荐阅读