使用MarkLogic通过xdmp:http-get()或xdmp:http-post()从web服务中拉入数据,我希望在尝试处理数据之前能够检查返回的标头。在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进入这个response节点。如果我将返回语句更改为return $result/response/code,则会得到空序列。如果我可以在尝试处理返回的实际数据之前检查代码,以确保返回的值为200,这将比使用try-catch块查看数据是否存在以及是否正常要好得多。
因此,如果有人知道如何访问这些响应代码,我希望看到您的解决方案。
根据记录,我已经尝试过xdmp:get-response-code(),但它不需要任何参数,所以我不知道它查看的是什么响应代码。
发布于 2012-06-08 03:49:04
你一下子就被两个陷阱吓到了:
namespaces
首先,名称空间。http-get函数的XML输出位于顶级元素所示的名称空间中:
<response xmlns="xdmp:http-get">要成功访问该名称空间中的元素,需要在绑定到正确名称空间的查询中声明前缀,然后在XPath表达式中使用该前缀。例如:
declare namespace h="xdmp:http-get";
//h:code现在让我们来讨论一下文档节点。:-)
您试图访问$result,就好像它是一个包含元素的文档节点,但实际上,它是一个由两个根节点组成的序列(因此它们也不是兄弟节点)。第一个(这里您感兴趣的)是一个无父元素的<response>元素--而不是一个包含<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
https://stackoverflow.com/questions/10936494
复制相似问题