4

Java クライアントを使用して MarkLogic ディレクトリ内のすべてのドキュメントを表すMS-Excel互換性のあるファイルを作成するにはどうすればよいですか?どちらもリモートに配置されています。ディレクトリ内のドキュメント数は約 15000 です。csvXCCTomcatMarklogic

4

1 に答える 1

3

ディレクトリ内のすべてのドキュメントを取得する最初の部分は、XDMP-EXPNTREECACHEFULL を回避してドキュメントをロードする準備ができています

cts:search(
  collection(),
  cts:directory-query('path/to/documents/', 'infinity'))

そこでの私の回答で述べたように、さらに制限が必要な場合は、他の条件でcts:and-queryそれを行うことができます。cts:directory-querycts:query

次に、各 XML ドキュメントを CSV に変換する必要があります。これは非常に単純ですが、XML がどのように構造化されているかを知っているか、何らかの方法でそれを推測する必要があります。この例では、ルート要素の下に常に単純な子​​要素, ,abあるとします。そのため、クエリでは、これらの要素の CSV ヘッダーを生成し、その後に CSV の行を追加する必要があります。cd

おそらく、呼び出し元からディレクトリ 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 に関するある程度の知識、またはその構造を推測する何らかの方法が必要です。一部の値を二重引用符で囲む必要がある場合もあります。しかし、この基本的な構造は、問題を解決するための最も効率的な方法の 1 つです。結果をストリーミングできるように、XQuery FLWOR 式は一切使用しませんでした。

もう 1 つの方法は、範囲インデックスと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')))
于 2013-02-24T21:51:42.443 に答える