我的XQuery代码应从MarkLogic数据库加载大量xml文件,解析它们,并以单个xml输出所有结果。如何在XQuery中加载特定目录中的所有文件?例如,我有一个MarkLogic数据库,它有一个文件夹“test”,这个文件夹有不同的XML文件。我可以使用doc()函数加载每个文件,但当然我不能只写doc(“1.xml”),doc(“2.xml”)等等因为我不知道哪些文件是可用的在服务器上。现在我只能看到一个问题的解决方案:
以someserver / v1 / search?uri = test /的方式搜索REST接口,使用doc()函数加载它的结果,解析它们,然后在循环中加载每个文档。
但也许还有另一种解决这个问题的正确方法?我刚刚开始了解MarkLogic和XQuery,所以我真的可能会错过一些重要的东西。也许有比我提出的更直接的方法来搜索文档并加载它们?
答案 0 :(得分: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框架在后台逐个处理内容,并使用分页搜索来收集您可以存储在单独目录中的处理结果(每个输入文件一个结果doc),或者在属性中输入文件本身使用类似xdmp:document-set-property。
HTH!