2012-06-07 4 views
2

MarkLogic을 사용하여 웹 서비스의 데이터를 xdmp:http-get() 또는 xdmp:http-post()으로 가져 오려면, 처리하기 전에 돌아 오는 헤더를 검사 할 수 있어야합니다. 데이터.xdmp에서 HTTP 응답에 액세스하십시오. http-get()

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

을 그리고 내가 돌아올 결과는 다음과 같습니다 : DQ에서 나는이 작업을 수행 할 수 있습니다

<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 $result/response/code으로 변경하면 빈 시퀀스가 ​​생깁니다. 만약 내가 돌아 왔다는 실제 데이터를 처리하려고 시도하기 전에 내가 다시 200을 가지고 있는지 확인하기 위해 그 코드를 점검 할 수 있다면 데이터가 존재하고 정상적인지를보기 위해 try-catch 블록을 사용하는 것보다 훨씬 낫다.

아무도 그 응답 코드에 액세스하는 방법을 알고 있다면 나는 당신의 해결책을보고 싶습니다.

레코드의 경우 xdmp:get-response-code()을 시도했지만 매개 변수를 사용하지 않으므로 응답 코드가 무엇인지 알 수 없습니다.

답변

7

당신은 한 번에 두 개는에 의해 태워지고있어 : 네임 스페이스, 네임 스페이스의

  • 인식이 문서의 노드
  • 인식

첫째. 최상위 요소에 의해 볼 수 있듯이 HTTP-얻을 함수의 XML 출력은 네임 스페이스에 있습니다 :

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

성공적으로 네임 스페이스의 요소에 액세스하려면 올바른 바인딩 쿼리에 접두사를 선언해야 네임 스페이스를 만들고 XPath 식에서 해당 접두사를 사용하십시오. 예 :

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

이제 문서 노드에 대해 이야기 해 보겠습니다. :-)

요소를 포함하는 문서 노드 인 것처럼 $result에 액세스하려하지만 실제로는 두 개의 루트 노드로 이루어진 시퀀스이므로 형제는 아닙니다. 첫 번째 항목 (여기에 관심이있는 항목)은 부모가없는 <response> 요소 인 이 아니며 요소 인 <response> 요소가 포함 된 문서입니다.

이것은 문서 노드가 있는지 여부를 아는 일반적인 문제입니다. 문서 노드는 직렬화 될 때 항상 표시되지 않으므로 (따라서 잡아 당김) 항상 데이터베이스에 저장된 문서에 표시됩니다. 그러나 XQuery에서 베어 메 트리 생성자를 사용하는 경우 (http-get 구현 에서처럼) 문서 노드가 아니라 노드 노드가없는 요소 노드를 생성한다.반면에

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

가지고 있기 때문에, 다음과 같은 반환 <foo>을한다 : <foo><foo> 아이를 얻기 위해 노력하고 있기 때문에

예를 들어, 다음 쿼리는 빈 시퀀스를 반환합니다 (XQuery에에서, 명시 적 구성되어야한다) 문서 노드의 자식 <foo> :

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

그래서 주어진 함수의 API가 어떻게 설계되었는지 (요소를 포함하고있는 문서를 반환하는지 또는 요소만을 포함하는지) 알아야합니다.

문제를 해결하려면 의 자식을 얻으려고 시도하는 $result/h:response/h:code에 액세스하지 마십시오. 대신 $result/h:code (보다 정확하게는 $result[1]/h:code)에 액세스하십시오. 이는 <response>이 http-get 함수에 의해 반환 된 두 노드의 시퀀스 중 첫 번째이기 때문에입니다. 문서 노드에 대한 자세한 내용은

,이 블로그 기사 시리즈 체크 아웃 다음에 저장되지 않은` `와 같은 임시 XML에서와 같이 실제 성능에 영향이 없습니다 특히 http://community.marklogic.com/blog/document-formats-part1 네임 스페이스에

+3

, 가끔 (속임수를 데이터베이스) 네임 스페이스를 선언하는 대신 네임 스페이스 와일드 카드를 사용하면됩니다 :'$ result/* : code' –

관련 문제