使用XQuery递归复制文件夹

时间:2017-08-29 14:27:53

标签: recursion transactions xquery marklogic xquery-update

我必须在MarkLogic服务器中复制整个项目文件夹,而不是手动执行,我决定使用递归函数来完成它,但这已成为我曾经遇到过的最糟糕的想法。我遇到了事务和语法方面的问题,但是我没有找到解决问题的真正方法。这是我的代码,谢谢你的帮助!

import module namespace dls = "http://marklogic.com/xdmp/dls" at "/MarkLogic/dls.xqy";

declare option xdmp:set-transaction-mode "update";

declare function local:recursive-copy($filesystem as xs:string, $uri as xs:string)
{
  for $e in xdmp:filesystem-directory($filesystem)/dir:entry
  return 
    if($e/dir:type/text() = "file")
        then dls:document-insert-and-manage($e/dir:filename, fn:false(), $e/dir:pathname)
    else
      (
          xdmp:directory-create(concat(concat($uri, data($e/dir:filename)), "/")),
          local:recursive-copy($e/dir:pathname, $uri)
      )

};

let $filesystemfolder := 'C:\Users\WB523152\Downloads\expath-ml-console-0.4.0\src'
let $uri := "/expath_console/"

return local:recursive-copy($filesystemfolder, $uri)

1 个答案:

答案 0 :(得分:3)

MLCP本来很好用。但是,这是我的版本:

 GreatDane : [object Object]
   GermanSheppard : [object Object]
   Beagle : [object Object]
   BullDog : [object Object]

请注意以下事项:

  • 我将示例更改为C:\ Temp dir
  • 输出只是XML,因为按照惯例我会尝试这样做,以防我想分析结果。实际上,我发现错误与更新冲突有关。
  • 我选择在URI
  • 上定义一个简单的前缀替换
  • 我认为您的描述中不需要DLS
  • 我认为不需要在用例
  • 中显式创建目录
  • 您因为仅使用文件名作为URI而导致更新冲突的原因。在整个目录结构中,这些名称不是唯一的 - 因此在相同URI的双重插入上存在冲突的更新。
  • 这不是可靠的代码:
    • 您必须确保URI有效。并非所有文件系统路径/名称都适用于URI,因此如果需要,您可能需要对此进行测试并转义字符。
    • 大型文件系统会超时,因此批量生成可能会有用。
      • 一个例子,我可能会收集我的XML中的文档列表,然后通过为每100个文档生成一个新任务来处理该列表。这可以通过xdmp:spawn-function上的简单循环或@mblakele使用taskbot等库来实现