【问题标题】:search and load all XML files in XQuery在 XQuery 中搜索并加载所有 XML 文件
【发布时间】:2013-10-08 08:56:53
【问题描述】:

我的 XQuery 代码应该从 MarkLogic 数据库加载一些 xml 文件,解析它们,并以单个 xml 输出所有结果。如何在 XQuery 中加载特定目录中的所有文件?例如,我有一个 MarkLogic 数据库,它有一个文件夹“test”,这个文件夹有不同的 XML 文件。我可以使用 doc() 函数加载每个文件,但我当然不能只写 doc("1.xml")、doc("2.xml") 等等,因为我不知道有哪些文件可用在服务器上。目前我只能看到 1 个解决问题的方法:

以类似 someserver/v1/search?uri=test/ 的方式在 REST 接口上进行搜索,使用 doc() 函数加载结果,解析它们,然后循环加载每个文档。

但也许有另一种正确的方法来解决这个问题?我刚刚开始了解 MarkLogic 和 XQuery,所以我真的会错过一些重要的东西。也许有比我建议的更直接的方法来搜索文档并加载它们?

【问题讨论】:

    标签: xml xquery marklogic


    【解决方案1】:

    你可以使用类似的东西:

    <my-results>{
      for $doc in xdmp:directory("test/", "infinity") (: use depth = '1' for no recursion :)
      return my:format-results(my:parse($doc))
    }</my-results>
    

    或:

    <my-results>{
      for $uri in cts:uri-match("test/", "document")
      let $doc := fn:doc($uri)
      return my:format-results(my:parse($doc))
    }</my-results>
    

    但如果您的数据库包含大量 XML 文件,则生成的 XML 可能会变得非常大,从而导致资源和超时问题。最好使用 CPF 框架在后台逐一处理内容,并使用分页搜索来收集处理结果,您可以将这些结果存储在单独的目录中(每个输入文件一个结果文档),或者存储在使用 xdmp:document-set-property 之类的输入文件本身。

    HTH!

    【讨论】:

    • 我相信 xdmp:directory 调用需要斜杠:xdmp:directory("/test/")
    • 调用xdmp:directory也需要depth参数。目录 URI 不必有一个前导斜杠,但它必须有一个尾随斜杠。所以test/ 很好,但test 不起作用。像test/ 这样的目录 URI 的唯一缺点是您可能无法将 webdav 服务器连接到它。或者这可能是一个功能。
    • 正确,谢谢。如果没有斜杠,xdmp:directory 将不会返回结果(也不会遗憾地抱怨)。深度参数是可选的,默认为 '1',只有直接子级。
    • @mblakele thnx,修复了答案
    • @dave-cassel thnx,修复了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2013-08-02
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多