使用 Groovy 和 XMLSulrper 数据复制目录

Posted

技术标签:

【中文标题】使用 Groovy 和 XMLSulrper 数据复制目录【英文标题】:Copying directory using Groovy & XMLSulrper data 【发布时间】:2017-10-18 07:00:54 【问题描述】:

请帮忙,以免我把头发扯掉......

我需要使用从 XML 获取数据的 groovy 将文件夹 A 简单地复制到文件夹 B。我必须使用 XMLSlurper 或 XMLParser

就是这样-

println "Start"

def Folders = new XmlSlurper().parse(new File("CopyParams.xml"))

Folders.Folder.each

it.DirectoryToCopy.each

println "Copying $it.@source into folder $it.@target"

new AntBuilder().copy (
todir: "$it.@target")

fileset(
dir: "$it.@source" )




println "End"

System.exit(0)

然后我得到-

> Copying C:\Temp\Groovy\Source_Folders into folder C:\Temp\Groovy\Target_Foler
Caught: groovy.lang.MissingFieldException: No such field: source for class: org.codehaus.groovy.runtime.NullObject
groovy.lang.MissingFieldException: No such field: source for class: org.codehaus.groovy.runtime.NullObject
at testCopy$_run_closure1_closure2_closure3.doCall(testCopy.gvy:14)
at testCopy$_run_closure1_closure2_closure3.doCall(testCopy.gvy)
at testCopy$_run_closure1_closure2.doCall(testCopy.gvy:11)
at testCopy$_run_closure1.doCall(testCopy.gvy:7)
at testCopy.run(testCopy.gvy:5)

我尝试在复制之前使用-

String src = $it.@source[0]
String dst = $it.@target[0]

或者

String src = new XmlNodePrinter().print($it.@source)
String dst = new XmlNodePrinter().print($it.@target)

然后我得到-

> Copying C:\Temp\Groovy\Source_Folders into folder C:\Temp\Groovy\Target_Foler
Caught: groovy.lang.MissingMethodException: No signature of method: testCopy.$() is applicable for argument types: (testCopy$_run_
closure1_closure2_closure3) values: [testCopy$_run_closure1_closure2_closure3@1b06cab]
Possible solutions: is(java.lang.Object), run(), run(), any(), any(groovy.lang.Closure), use([Ljava.lang.Object;)
groovy.lang.MissingMethodException: No signature of method: testCopy.$() is applicable for argument types: (testCopy$_run_closure1
_closure2_closure3) values: [testCopy$_run_closure1_closure2_closure3@1b06cab]
Possible solutions: is(java.lang.Object), run(), run(), any(), any(groovy.lang.Closure), use([Ljava.lang.Object;)
at testCopy$_run_closure1_closure2.doCall(testCopy.gvy:11)
at testCopy$_run_closure1.doCall(testCopy.gvy:7)
at testCopy.run(testCopy.gvy:5)

我也尝试过使用 FileUtils,但出现了更多无法理解的错误

我做错了什么?

如果我使用“XMLParser”会更好吗?

谢谢, 以利

【问题讨论】:

【参考方案1】:

当然有多种选项/方法可以将文件夹的内容复制到另一个文件夹。

最简单的方法是使用FileUtils.copyDirectory(),Java 内置,如这篇 SO 帖子所述:Copy entire directory contents to another directory?

或者,您可以使用 Java 的 `Files.copy',如下所述:http://docs.oracle.com/javase/tutorial/essential/io/copy.html

import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

您可以使用AntBuilder,您正在示例中尝试使用它。你根本不需要使用XMLSlurperAntBuilder 能够在不处理单个文件的情况下复制整个文件夹(或者可以过滤掉文件,即通过扩展名)。例如:

String sourceDir = SOURCE_DIR_PATH
String destinationDir = DESTINATION_DIR_PATH

new AntBuilder().copy(todir: destinationDir) 
     fileset(dir : sourceDir) 
         exclude(name:"*.java")
     

或者没有过滤,简单地说:

new AntBuilder().copy(todir: destinationDir)

【讨论】:

我更新了我的问题,我必须使用 XMLParser 或 XMLSlurper 来读取和使用其他属性,而无需连接到副本。至于您的其他建议,请尝试过,但是我从 XMLSlurper 获得的对象无法转换为文件,因此我无法使用您的建议/ 和@pczeus 至于你的 AntBuilder 建议,你可以看到我在使用它时遇到的错误【参考方案2】:

在同事的帮助下找到了答案 -

将从 XMLSlurper 获得的变量声明为字符串应该使用 "def"

def sourceDir = "$it.@source"
def destinationDir = "$it.@target"

【讨论】:

以上是关于使用 Groovy 和 XMLSulrper 数据复制目录的主要内容,如果未能解决你的问题,请参考以下文章

Groovy使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 客户端开发 )

08-Groovy-数据类型-String介绍

Groovy使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器端开发 )

Groovy单元测试框架spock数据驱动Demo

groovy grails构建测试数据(buildtestdata插件)如何创建多对多

如何使用Elasticsearch groovy script脚本更新数据