ms-excel兼容的csv文件,表示MarkLogic目录中的所有文档

时间:2013-02-22 04:32:35

标签: marklogic

如何最好地制作代表MarkLogic目录中所有文档的MS-Excel兼容csv文件使用XCC Java客户端和Tomcat以及Marklogic两者都是位于远处。目录中的文档数量约为15000。

1 个答案:

答案 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是如何构建的,或者有一些方法来推断它。对于这个例子,我会说我在一些根元素下总是有简单的子元素abcd。因此查询需要为这些元素生成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-tuplescts: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')))