2016-06-23 7 views
3

私は、クエリオプションを使用して、「が一致」文書から取られたいくつかの要素を持つ私の検索結果を豊かにしようとしているのXML文字列要素として来る「エキス、文書データ」以下のようなエキス・文書データは、JSON出力

<options xmlns="http://marklogic.com/appservices/search"> 
<extract-document-data selected="include"> 
     <extract-path>/language-version/language-version-canonical-model/title</extract-path> 
     <extract-path>/language-version/language-version-canonical-model/language</extract-path> 
</extract-document-data> 
(...) 
</options> 

私は、検索を実行すると、私は(Acceptヘッダーを使用して:application/json)JSON出力を求める私は結果としてJSONと「strinxml」のミックスとして取得:

{ 
    "snippet-format": "snippet", 
    "total": 564, 
    "start": 1, 
    "page-length": 10, 
    "selected": "include", 
    "results": [ 
    { 
     "index": 1, 
     "uri": "ENV/CHEM/NANO(2015)22/ANN5/2", 
     "path": "fn:doc(\"ENV/CHEM/NANO(2015)22/ANN5/2\")", 
     (...) 
     "matches": [ 
     { 
      "path": "fn:doc(\"ENV/CHEM/NANO(2015)22/ANN5/2\")/ns2:language-version/ns2:language-version-raw-data/*:document/*:page[22]", 
      (...) 
     } 
     ], 
     "extracted": { 
     "kind": "element", 
     "content": [ 
      "&lt;language&gt;En&lt;/language&gt;", 
      "&lt;title&gt;ZINC OXIDE DOSSIERANNEX 5&lt;/title&gt;", 
      "&lt;reference&gt;ENV/CHEM/NANO(2015)22/ANN5&lt;/reference&gt;", 
      "&lt;classification&gt;2&lt;/classification&gt;", 
      "&lt;modificationDate&gt;2015-04-16T00:00:00.000+02:00&lt;/modificationDate&gt;", 
      "&lt;subject label_en=\"media\" &gt;media&lt;/subject&gt;", 
      "&lt;subject label_en=\"fish\" "&gt;fish&lt;/subject&gt;", 
     ] 
     } 
    }, 

ここでの問題は、あなたが、それは私が本当にJSONに変換するためにそれらを期待要素は、単に文字列としてコピーされているXML、のように見える見ることができるよう、一部「を抽出」であります

誰でもこの問題について考えていますか?

答えて

6

MarkLogicはコンテンツを変換しません。したがって、JSON形式の検索応答を要求するときにXMLはXMLのままです。 JSONの内部にXMLを実際に埋め込むことはできないので、文字列としてシリアル化されます。

検索結果にRESTトランスフォームを適用し、json:transform-to-json(おそらくカスタム設定を使用)のようなものを使用して、オンザフライで変換することができます。たとえば、次のようなものです。サーバー側のJavaScriptトランスフォーム:

/* jshint node:true,esnext:true */ 
/* global xdmp */ 

var json = require('/MarkLogic/json/json.xqy'); 
var config = json.config('custom'); 

function toJson(context, params, content) { 
    'use strict'; 

    var response = content.toObject(); 

    if (response.results) { 
    response.results.map(function(result) { 
     if (result.extracted && result.extracted.content) { 
     result.extracted.content.map(function(content, index) { 
      if (content.match(/^</) && !content.match(/^<!/)) { 
      result.extracted.content[index] = json.transformToJson(xdmp.unquote(content), config); 
      } 
     }); 
     } 
    }); 
    } 

    return response; 
} 

exports.transform = toJson; 

もちろん、クライアント側も変換できます。

HTH!あなたが抽出された項目を読み取るためにそれぞれの結果のために正しいハンドルを使用することができますJavaクライアントAPIを使用している場合

+0

おかげで多くのことを、魔法のように動作します! –

1

ExtractedResultExtractedItemを参照してください):

SearchHandle results = queryManager.search(query, new SearchHandle()); 
for (MatchDocumentSummary summary : results.getMatchResults()) { 
    ExtractedResult extracted = summary.getExtracted(); 
    // here we check to see if this result is XML format, and if so 
    // we use org.w3c.dom.Document 
    if (Format.XML == summary.getFormat()) { 
     for (ExtractedItem item : extracted) { 
      Document extractItem = item.getAs(new DOMHandle()).get(); 
      ... 
     } 
    // or if the result is JSON we could choose a different handle 
    } else if (Format.JSON == summary.getFormat()) { 
     for (ExtractedItem item : extracted) { 
      JsonNode extractItem = item.getAs(JsonNode.class); 
      ... 
     } 
    } 
} 
+0

実際、これはうまくいくでしょう。私の場合でも、クライアントはJavaScriptアプリケーションであり、私はそれらのための変換を行う必要があります... –