Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MarkLogic EVAL REST服务输出返回为JSON_Json_Xml_Rest_Eval_Marklogic - Fatal编程技术网

将MarkLogic EVAL REST服务输出返回为JSON

将MarkLogic EVAL REST服务输出返回为JSON,json,xml,rest,eval,marklogic,Json,Xml,Rest,Eval,Marklogic,我正在制作一个演示,使用MarkLogic将从Outlook导出的电子邮件存储为XML,这样,当我离开Outlook时,它们就可以搜索和访问 我正在使用AngularJS前端调用自己的REST服务的本机MarkLogic REST服务,这些服务是使用Jersey用JAVA编写的 MarkLogic SEARCH REST服务可以很好地根据各种搜索条件返回文档引用列表,但我还希望显示存储在已查找文档中的信息 我希望避免多次REST调用,只返回所需的信息,因此我尝试使用evalREST服务来运行xQ

我正在制作一个演示,使用MarkLogic将从Outlook导出的电子邮件存储为XML,这样,当我离开Outlook时,它们就可以搜索和访问

我正在使用AngularJS前端调用自己的REST服务的本机MarkLogic REST服务,这些服务是使用Jersey用JAVA编写的

MarkLogic SEARCH REST服务可以很好地根据各种搜索条件返回文档引用列表,但我还希望显示存储在已查找文档中的信息

我希望避免多次REST调用,只返回所需的信息,因此我尝试使用evalREST服务来运行xQuery

返回XML(在多部分/混合消息中)效果很好,但我似乎无法取而代之地获取JSON,这将更加方便,并且对于大多数其他MarkLogic REST服务来说非常容易

我可以在xQuery中使用“json:transform-to-json()”,也可以在JAVA代码中将XML转换为json,但这在我看来并不优雅


有没有更有效的方法来实现我的目标?

首先,json:transform to json对我来说非常优雅。当然,这并不总是正确的答案

我看到了三个你没有提到的选项

  • 服务器端转换-REST search支持服务器端转换,在执行操作时转换每个文档。这些服务器端转换可以生成您需要的任何json
  • -这是提取部分文档的最简单方法。但如果您的文档是json以匹配您的json响应,这似乎是最好的。否则,您将在json响应中获取xml。除非你同意
  • -另一种非常强大的自定义搜索返回内容的方法

  • 所有这些选项都不需要eval所需的特权,这是一件非常好的事情。由于eval允许在您的服务器上执行任意代码,因此它需要特殊权限,使用时应非常小心。在使用eval之前,还有两个选项(1)和(2)。

    Sam的答案就是我的建议。具体来说,我会为搜索提取文档数据设置一个搜索选项(这是一个搜索API选项。如果您发布请求,则可以在您发回的XML中添加该选项。如果您使用GET,则需要提前注册该选项并调用它。相关URL可提供帮助:

    至于json..ML8将转换内容。使用accept标头或只是将format=json添加到结果中

    示例-我的内容存储为的xml:


    对于真正的繁重工作,您可以使用Sam描述中的服务器端转换。关于这一点,请注意。服务器端转换不是搜索API的一部分,而是REST API的一部分。仅提及它,您就可以了解在每种情况下使用的工具。

    首先,非常感谢您如此快速且大量地响应好的信息。很抱歉“不优雅”这个词可能不是最合适的。我的意思是,必须有一种比使用EVAL服务更好的方法,而EVAL服务在安全性方面并不理想。我已经使用“提取文档数据”进行了测试但不幸的是,正如您所解释的,它返回的是JSON和XML的混合,这并不理想。我认为XML和JSON只是从MarkLogic的角度表示相同信息的两种不同方式,但显然没有那么简单。也许我应该像Samplestack示例中那样将数据存储为JSON您建议的选项:在我看来,批量读取查询将每个文档作为多部分/混合消息的一个单独部分返回。应用转换时是否相同?是否有方法返回单个JSON?您是否有一个示例?我想我也需要查看自定义搜索片段。您会推荐什么作为最佳方法?我有f我最终选择将我的数据作为JSON存储在MarkLogic中,并使用“提取文档数据”,因为这是馈送Angular JS前端最简单的方法。非常感谢您的回复。
    <search:result index="1" uri="/sample/collections/1.xml" path="fn:doc("/sample/collections/1.xml")" score="34816" confidence="0.5982239" fitness="0.6966695" href="/v1/documents?uri=%2Fsample%2Fcollections%2F1.xml" mimetype="application/xml" format="xml">
    <search:snippet>
    <search:match path="fn:doc("/sample/collections/1.xml")/x">
    <search:highlight>watermellon</search:highlight>
    </search:match>
    </search:snippet>
    </search:result>
    
            "index":1,
             "uri":"/sample/collections/1.xml",
             "path":"fn:doc(\"/sample/collections/1.xml\")",
             "score":34816,
             "confidence":0.5982239,
             "fitness":0.6966695,
             "href":"/v1/documents?uri=%2Fsample%2Fcollections%2F1.xml",
             "mimetype":"application/xml",
             "format":"xml",
             "matches":[  
                {  
                   "path":"fn:doc(\"/sample/collections/1.xml\")/x",
                   "match-text":[  
                      {  
                         "highlight":"watermellon"
                      }
                   ]
                }
             ]
          }