如何将项目导入eXist-db

时间:2014-03-21 05:32:07

标签: xquery exist-db

我是新手,并且存在-db所以我已经习惯了它的gui和菜单以及做事的方式。我的问题是我已经有了一个项目,一位老师从他的存在下载了它,然后把它作为.rar送给我。

问题是我想以一种保持与其具有相同文件夹结构的方式导入该项目。我已经尝试通过集合菜单导入它,但它忽略了文件夹结构,只是将所有文件上传到一个文件夹中

文件夹结构如下:

final:
-db
    -contrib
        -file
        -file
    -css
        -somecss
        -somecss
    -js
        -somejs
        -somejs
    -img
        -img1.png
-xqueryelement.xq
-xqueryelement2.xq
-htmlelement.html

3 个答案:

答案 0 :(得分:3)

除了Ron和Loren建议的方法之外,你可以使用WebDAV客户端 - 可能是最简单的。或者您可以使用xmldb:store-files-from-pattern()函数编写查询(例如,在eXide中)。文章Getting Data into eXist-db中提到了上述所有内容。

如果您对使用xmldb:store-files-from-pattern()功能感兴趣,请参阅具体说明。您将使用带有$preserve-structure参数的函数变体。此函数变体的函数文档的直接链接是http://exist-db.org/exist/apps/fundocs/view.html?uri=http://exist-db.org/xquery/xmldb#store-files-from-pattern.5。以下是步骤:

  1. 将.rar文件展开到文件系统上的文件夹中,例如/ path / to / files
  2. 打开eXide(可能在本地系统的http://localhost:8080/exist/apps/eXide处)。例如,以管理员用户身份登录,以便您的查询能够写入数据库。
  3. 使用此查询:

    xquery version "3.0";
    
    let $collection-uri := '/db'
    let $directory := '/path/to/files'
    let $pattern := '**/*'
    let $mime-type := ()
    let $preserve-structure := true()
    return
        xmldb:store-files-from-pattern($collection-uri, $directory, $pattern, $mime-type, $preserve-structure)
    

答案 1 :(得分:2)

要在eXist中上传文件夹结构,您有两个选项:

  1. 使用Java admin client;在vanilla eXist安装中,您可以通过浏览器http://localhost:8080/exist/webstart/exist.jnlp或通过http://localhost:8080/exist/apps/dashboard/index.html仪表板中的链接直接访问它;或者通过快速启动按钮中的弹出菜单(右下角的快速启动工具栏,如果你在Windows上)。在那里你可以添加整个文件夹。
  2. 将项目打包为XAR存档,其中必要的是具有适当项目描述符文件的zip存档。请参阅http://exist-db.org/exist/apps/doc/repo.xml
  3. 上的详细信息

    希望这有帮助,

    罗恩

答案 2 :(得分:2)

如果解压缩.rar文件并且每个文件夹包含“_ _ contents_ _.xml”,则可以使用java admin客户端的还原功能。

如果没有,则可以使用以下内容。 (我没有测试代码并在运行中编写它。)从仪表板启动eXide。以admin身份登录,然后将下面的代码复制到ide中,然后运行它。

该代码具有从Priscilla Walmsley的FUNCTX功能模块复制的一些功能。 http://www.xqueryfunctions.com/

xquery version "3.0";

declare namespace file="http://exist-db.org/xquery/file";

(:~
 : Escapes regex special characters 
 :
 : @author  Priscilla Walmsley, Datypic 
 : @version 1.0 
 : @see     http://www.xqueryfunctions.com/xq/functx_escape-for-regex.html 
 : @param   $arg the string to escape 
 :) 
declare function local:escape-for-regex( $arg as xs:string? )  as xs:string {

   replace($arg, '(\.|\[|\]|\\|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1')
 } ;

(:~
 : The substring before the last occurrence of a delimiter 
 :
 : @author  Priscilla Walmsley, Datypic 
 : @version 1.0 
 : @see     http://www.xqueryfunctions.com/xq/functx_substring-before-last.html 
 : @param   $arg the string to substring 
 : @param   $delim the delimiter 
 :) 
declare function local:substring-before-last( $arg as xs:string?, $delim as xs:string )  as xs:string {

   if (matches($arg, local:escape-for-regex($delim)))
   then replace($arg,
            concat('^(.*)', local:escape-for-regex($delim),'.*'),
            '$1')
   else ''
 } ;

(:~
 : The substring after the last occurrence of a delimiter 
 :
 : @author  Priscilla Walmsley, Datypic 
 : @version 1.0 
 : @see     http://www.xqueryfunctions.com/xq/functx_substring-after-last.html 
 : @param   $arg the string to substring 
 : @param   $delim the delimiter 
 :) 
declare function local:substring-after-last 
  ( $arg as xs:string? ,
    $delim as xs:string )  as xs:string {

   replace ($arg,concat('^.*',local:escape-for-regex($delim)),'')
 } ;


declare function local:import($base as xs:string, $path as xs:string) {
    let $offset := fn:substring-after($path, $base)
    return
    if (file:is-directory($path))
    then
        let $created := xmldb:create-collection('/', '/')
        let $coll := for $resource in file:list($path)
                        return local:import($base, $path || '/' || $resource)
        return $path
    else 
        let $collection : = local:substring-before-last($offset, '/')
        let $resource : = local:substring-after-last($offset, '/')
        let $stored := xmldb:store($collection, $resource, 
                                file:read-binary($path), 'application/octet-stream')
        let $permission := if (fn:ends-with($resource, ".xq")) 
                           then sm:chmod($collection || '/' || $resource, 'rwxr-xr-x')
                           else ()
        return $path
};

let $base := '/tmp/lctmp'
let $path := '/tmp/lctmp/db'
return local:import($base, $path)