带有Xquery的文件夹的递归副本



我必须复制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:UsersWB523152Downloadsexpath-ml-console-0.4.0src'
let $uri := "/expath_console/"
return local:recursive-copy($filesystemfolder, $uri)

MLCP会很不错。但是,这是我的版本:

declare option xdmp:set-transaction-mode "update";
declare variable $prefix-replace := ('C:/', '/expath_console/');
declare function local:recursive-copy($filesystem as xs:string){
   for $e in xdmp:filesystem-directory($filesystem)/dir:entry
    return 
      if($e/dir:type/text() = "file")
         then 
           let $source := $e/dir:pathname/text()
           let $dest := fn:replace($source, $prefix-replace[1], $prefix-replace[2]) 
           let $_ := xdmp:document-insert($source,
              <options xmlns="xdmp:document-load">
                <uri>{$dest}</uri>
              </options>)
           return <record>
                     <from>{$source}</from>
                     <to>{$dest}</to>
                  </record>
         else
           local:recursive-copy($e/dir:pathname)
};
let $filesystemfolder := 'C:Temp'
return <results>{local:recursive-copy($filesystemfolder)}</results> 

请注意以下内容:

  • 我将样本更改为c: temp dir
  • 输出仅是XML,仅是因为我想在我想分析结果的情况下尝试这样做。实际上,这是我发现与冲突更新有关的错误。
  • 我选择定义uris上的简单前缀替换
  • 我在您的描述中看到不需要DLS
  • 我认为在您的用例中不需要明确创建目录
  • 您之所以获得矛盾的更新,是因为您仅将文件名用作URI。在整个目录结构中,这些名称不是唯一的 - 因此,在同一URI的双插入物上进行了冲突的更新。
  • 这不是可靠的代码:
    • 您必须确保URI有效。并非所有文件系统路径/名称都可以使用URI,因此您需要对此进行测试并在需要时逃脱字符。
    • 大型文件系统将暂停,因此批量产卵可能很有用。
      • 一个例子,我可能会像XML中一样收集文档列表,然后通过每100个文档产生新任务来处理该列表。这可以通过XDMP:产卵功能的简单循环来完成

相关内容

  • 没有找到相关文章

最新更新