使用 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
,您正在示例中尝试使用它。你根本不需要使用XMLSlurper
。 AntBuilder
能够在不处理单个文件的情况下复制整个文件夹(或者可以过滤掉文件,即通过扩展名)。例如:
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 套接字程序 ( 客户端开发 )
Groovy使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器端开发 )