簡體   English   中英

使用XQuery遞歸復制文件夾

[英]Recursive copy of a folder with 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:\Users\WB523152\Downloads\expath-ml-console-0.4.0\src'
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目錄
  • 輸出只是XML,因為按照慣例,我嘗試這樣做,以防我想分析結果。 實際上,我發現了與沖突更新相關的錯誤。
  • 我選擇在URI上定義一個簡單的前綴替換
  • 我在你的描述中看不到DLS
  • 我認為不需要在用例中顯式創建目錄
  • 您之所以獲得沖突的原因是因為您只使用文件名作為URI。 在整個目錄結構中,這些名稱不是唯一的 - 因此對同一URI的雙重插入進行沖突更新。
  • 這不是可靠的代碼:
    • 您必須確保URI有效。 並非所有文件系統路徑/名稱都適用於URI,因此您需要測試此內容並在需要時轉義字符。
    • 大型文件系統會超時,因此批量生成可能會有用。
      • 舉個例子,我可能會收集我的XML中的文檔列表,然后通過為每100個文檔生成一個新任務來處理該列表。 這可以通過xdmp:spawn-function上的簡單循環或@mblakele使用諸如taskbot之類的庫來實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM