0

我的 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,所以我真的会错过一些重要的东西。也许有比我建议的更直接的方法来搜索文档并加载它们?

4

1 回答 1

4

你可以使用类似的东西:

<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 之类的东西。

于 2013-10-08T09:42:45.387 回答