我是新手,并且存在-db所以我已经习惯了它的gui和菜单以及做事的方式。我的问题是我已经有了一个项目,一位老师从他的存在下载了它,然后把它作为.rar送给我。
问题是我想以一种保持与其具有相同文件夹结构的方式导入该项目。我已经尝试通过集合菜单导入它,但它忽略了文件夹结构,只是将所有文件上传到一个文件夹中
文件夹结构如下:
final:
-db
-contrib
-file
-file
-css
-somecss
-somecss
-js
-somejs
-somejs
-img
-img1.png
-xqueryelement.xq
-xqueryelement2.xq
-htmlelement.html
答案 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。以下是步骤:
http://localhost:8080/exist/apps/eXide
处)。例如,以管理员用户身份登录,以便您的查询能够写入数据库。使用此查询:
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中上传文件夹结构,您有两个选项:
http://localhost:8080/exist/webstart/exist.jnlp
或通过http://localhost:8080/exist/apps/dashboard/index.html
仪表板中的链接直接访问它;或者通过快速启动按钮中的弹出菜单(右下角的快速启动工具栏,如果你在Windows上)。在那里你可以添加整个文件夹。希望这有帮助,
罗恩
答案 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)