如何最好地使用Java 客户端制作一个表示 MarkLogic 目录中所有文档的MS-Excel
兼容文件,并且两者都位于远程。目录中的文档数量约为 15000。csv
XCC
Tomcat
Marklogic
1 回答
第一部分,获取目录中的所有文档,为我们准备好避免 XDMP-EXPNTREECACHEFULL 和加载文档
cts:search(
collection(),
cts:directory-query('path/to/documents/', 'infinity'))
正如我在那里的回答中所指出的,如果您需要进一步的限制,您可以cts:and-query
使用cts:directory-query
其他cts:query
条款。
接下来,您需要将每个 XML 文档转换为 CSV。这相当简单,但您必须知道您的 XML 的结构或有某种方式来推断它。对于这个例子,我会说我总是在某个根元素下有简单的子元素a
, b
, 。因此查询需要为这些元素生成一个 CSV 标题,然后是 CSV 行。c
d
我们可能还想从调用者那里提交目录 URI。如果您使用的是 REST,这将使用xdmp:get-request-field
,但对于 XCC,它是一个外部值。
declare variable $DIRECTORY-URI as xs:string external ;
declare function local:csv($root as element()) as xs:string
{
string-join(($root/a, $root/b, $root/c, $root/d), ',')
};
'A,B,C,D',
cts:search(
collection(),
cts:directory-query($DIRECTORY-URI, 'infinity'))/local:csv(*)
同样,local:csv
为您的应用程序工作需要一些 XML 知识或某种方式来推断其结构。您可能还需要将一些值放在双引号中。但这种基本结构是解决问题的最有效方法之一。我避免使用任何 XQuery FLWOR 表达式,以便结果可以流式传输。
另一种方法是使用范围索引和http://docs.marklogic.com/cts:value-tuples来cts:query
限制结果,然后将 JSON 转换为 CSV。这将更加有效,因为不会获取任何片段。但这不适用于某些 XML 结构,并且您可能没有为每个 CSV 字段创建范围索引的奢侈。
declare variable $DIRECTORY-URI as xs:string external ;
declare function local:csv($ja as json:array) as xs:string
{
string-join(json:array-values($ja), ',')
};
'A,B,C,D',
local:csv(
cts:value-tuples(
(cts:element-reference(xs:QName('a')),
cts:element-reference(xs:QName('b')),
cts:element-reference(xs:QName('c')),
cts:element-reference(xs:QName('d'))),
(),
cts:directory-query($DIRECTORY-URI, 'infinity')))