2

xdmp:http-get()またはを使用して MarkLogic を使用して Web サービスからデータを取得するxdmp:http-post()場合、データを処理する前に返されるヘッダーを確認できるようにしたいと考えています。DQ で私はこれを行うことができます:

let $result := xdmp:http-get($query,$options) (: $query and $options are fine, I promise. :)
return $result

そして、返される結果は次のようになります。

<v:results v:warning="more than one node">
       <response>
           <code>200</code>
            <message>OK</message>
            <headers>
              <server>(actual server data was here)</server>
              <date>Thu, 07 Jun 2012 16:53:24 GMT</date>
              <content-type>application/xml;charset=UTF-8</content-type>
              <content-length>2296</content-length>
              <connection>close</connection>
            </headers>
        </response>

続いて実際の反応。問題は、この応答ノードに XPath できないように見えることです。return ステートメントを に変更するreturn $result/response/codeと、空のシーケンスが得られます。返された実際のデータを処理しようとする前に、そのコードをチェックして 200 が返されたことを確認できれば、try-catch ブロックを使用してデータが存在し、正常かどうかを確認するよりもはるかに優れています。

したがって、これらの応答コードにアクセスする方法を誰かが知っている場合は、あなたの解決策を見てみたい.

記録のために、試してみxdmp:get-response-code()ましたが、パラメーターをとらないため、どの応答コードを見ているのかわかりません。

4

1 に答える 1

8

一度に 2 つの落とし穴に悩まされています。

  • 名前空間の認識
  • ドキュメント ノードの認識

まず、名前空間。http-get 関数の XML 出力は、最上位の要素からわかる名前空間にあります。

<response xmlns="xdmp:http-get">

その名前空間の要素に正常にアクセスするには、正しい名前空間にバインドされたクエリでプレフィックスを宣言し、XPath 式でそのプレフィックスを使用する必要があります。例えば:

declare namespace h="xdmp:http-get";
//h:code

次に、ドキュメント ノードについて話しましょう。:-)

要素を含むドキュメント ノードであるかのようにアクセスしようとしています$resultが、実際には 2 つのルート ノードのシーケンスです (兄弟でもありません)。最初のもの (ここで注目しているもの) は親のない要素です。 <response><em><response>要素を含むドキュメントではありません。

これは一般的な落とし穴です: ドキュメント ノードがいつ存在するかどうかを知ることです。ドキュメント ノードは、シリアル化されると常に非表示になり (そのため問題があります)、データベースに保存されているドキュメントに常に存在します。ただし、(http-get 実装のように) XQuery で裸の要素コンストラクターを使用するだけの場合は、ドキュメント ノードではなく、ドキュメント ノードの親を持たない要素ノードを構築します。

たとえば、次のクエリは の<foo>子を取得しようとしているため、空のシーケンスを返し<foo>ます。

declare variable $foo := <foo>bar</foo>;
$foo/foo

一方、次の例では、(XQuery で明示的に作成する必要がある) ドキュメント ノードの子を取得しているため、返されます。<foo><foo>

$declare variable $doc := document{ <foo>bar</foo> };
$doc/foo

そのため、特定の関数の API がどのように設計されているか (要素を含むドキュメントを返すか、要素だけを返すか) を知る必要があります。

問題を解決するには、アクセスしようとしないでください(の子$result/h:response/h:codeを取得しようとしています)。代わりにアクセスします(より正確には、http-get 関数によって返される 2 つのノードのシーケンスの最初のノードであるため)。<response><response>$result/h:code$result[1]/h:code<response>

ドキュメント ノードの詳細については、次のブログ記事シリーズをご覧ください: http://community.marklogic.com/blog/document-formats-part1

于 2012-06-07T19:49:03.587 に答える