2

使用 MarkLogic 从带有xdmp:http-get()or的 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

你会同时被两个陷阱烧死:

  • 命名空间意识
  • 文档节点的意识

首先,命名空间。http-get 函数的 XML 输出位于顶层元素所见的命名空间中:

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

要成功访问该命名空间中的元素,您需要在绑定到正确命名空间的查询中声明一个前缀,然后在 XPath 表达式中使用该前缀。例如:

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

现在让我们谈谈文档节点。:-)

您尝试将其$result视为包含元素的文档节点进行访问,但实际上,它是两个根节点的序列(因此它们也不是兄弟节点)。第一个(您在这里感兴趣的那个)是无父<response>元素——<em>不是包含<response>元素的文档。

这是一个常见的问题:知道文档节点何时存在或不存在。文档节点在序列化时总是不可见的(因此有问题),并且它们总是存在于存储在数据库中的文档中。但是,当您只在 XQuery 中使用裸元素构造函数时(如 http-get 实现所做的那样),您构造的不是文档节点,而是没有文档节点父节点的元素节点。

例如,以下查询将返回空序列,因为它试图获取 的<foo>子级<foo>

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

另一方面,以下内容确实返回了<foo>,因为它正在获取<foo>文档节点的子节点(在 XQuery 中必须显式构造):

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

因此,您必须知道给定函数的 API 是如何设计的(无论它返回包含元素的文档还是仅返回一个元素)。

要解决您的问题,请不要尝试访问$result/h:response/h:code(这是试图获取的<response>孩子<response>)。相反,访问$result/h:code(或更准确地说$result[1]/h:code,因为<response>是 http-get 函数返回的两个节点序列中的第一个)。

有关文档节点的更多信息,请查看此博客文章系列:http: //community.marklogic.com/blog/document-formats-part1

于 2012-06-07T19:49:03.587 回答