如何最好地制作代表MarkLogic目录中所有文档的MS-Excel
兼容csv
文件使用XCC
Java客户端和Tomcat
以及Marklogic
两者都是位于远处。目录中的文档数量约为15000。
答案 0 :(得分:3)
第一部分,将所有文档放在目录中,可以从avoiding XDMP-EXPNTREECACHEFULL and loading document
为我们准备好cts:search(
collection(),
cts:directory-query('path/to/documents/', 'infinity'))
正如我在那里的回答中所述,如果您需要进一步的限制,cts:and-query
可以cts:directory-query
使用其他cts:query
条款。
接下来,您需要将每个XML文档转换为CSV格式。这很简单,但你必须知道你的XML是如何构建的,或者有一些方法来推断它。对于这个例子,我会说我在一些根元素下总是有简单的子元素a
,b
,c
,d
。因此查询需要为这些元素生成CSV标题,然后是CSV行。
我们可能还想从调用者那里提交目录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')))