在XQuery中搜索并加载所有XML文件

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

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

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


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

您可以使用以下方法:

<my-results>{
  for $doc in xdmp:directory("test/", "infinity") (: use depth = '1' for no recursion :)
  return my:format-results(my:parse($doc))
}</my-results>
{
对于xdmp:目录中的$doc(“test/”,“infinity”)(:使用depth='1'表示无递归:)
返回my:format结果(my:parse($doc))
}
或:

{
对于cts中的$uri:uri匹配(“测试/”,“文档”)
让$doc:=fn:doc($uri)
返回my:format结果(my:parse($doc))
}
但是,如果数据库包含大量XML文件,则生成的XML可能会变得非常大,从而导致资源和超时问题。最好使用CPF框架在后台逐个处理内容,并使用分页搜索来收集处理结果,这些结果可以存储在单独的目录中(每个输入文件一个结果文档),也可以使用类似xdmp:document set属性的内容存储在输入文件本身的属性中


您可以使用以下内容:

<my-results>{
  for $doc in xdmp:directory("test/", "infinity") (: use depth = '1' for no recursion :)
  return my:format-results(my:parse($doc))
}</my-results>
{
对于xdmp:目录中的$doc(“test/”,“infinity”)(:使用depth='1'表示无递归:)
返回my:format结果(my:parse($doc))
}
或:

{
对于cts中的$uri:uri匹配(“测试/”,“文档”)
让$doc:=fn:doc($uri)
返回my:format结果(my:parse($doc))
}
但是,如果数据库包含大量XML文件,则生成的XML可能会变得非常大,从而导致资源和超时问题。最好使用CPF框架在后台逐个处理内容,并使用分页搜索来收集处理结果,这些结果可以存储在单独的目录中(每个输入文件一个结果文档),也可以使用类似xdmp:document set属性的内容存储在输入文件本身的属性中


我相信xdmp:directory调用需要斜杠:
xdmp:directory(“/test/”)
调用
xdmp:directory
也需要深度参数。目录URI不需要有前导斜杠,但必须有尾随斜杠。所以
test/
可以,但是
test
不起作用。像
test/
这样的目录URI的唯一缺点是您可能无法将webdav服务器连接到它。或者这可能是一个功能。正确,thnx。如果没有尾部斜杠,
xdmp:directory
将不会返回结果(也不会抱怨)。深度参数是可选的,默认值为“1”,只有直接子项。@mblakele thnx,修复了answer@dave-cassel thnx,修复了答案我相信xdmp:directory调用需要斜杠:
xdmp:directory(“/test/”)
调用
xdmp:directory
也需要深度参数。目录URI不需要有前导斜杠,但必须有尾随斜杠。所以
test/
可以,但是
test
不起作用。像
test/
这样的目录URI的唯一缺点是您可能无法将webdav服务器连接到它。或者这可能是一个功能。正确,thnx。如果没有尾部斜杠,
xdmp:directory
将不会返回结果(也不会抱怨)。深度参数是可选的,默认值为“1”,只有直接子项。@mblakele thnx,修复了answer@dave-cassel thnx,修正了答案