2012-01-29 2 views
1

Xdbc 데이터베이스 연결을 만들고 성공적으로 샘플 프로그램을 실행했습니다. I 클래스 markLogics.java을 생성하고, jar 파일 marklogic-xcc-4.0.1.jar"XQueryException"가져 오기 예기치 않은 토큰 구문 오류

코드 스냅 샷 가져온 :

com.marklogic.xcc.exceptions.XQueryException: XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected QName_on line 1 
expr: 
    at com.marklogic.xcc.impl.handlers.ServerExceptionHandler.handleResponse(ServerExceptionHandler.java:31) 
    at com.marklogic.xcc.impl.handlers.EvalRequestController.serverDialog(EvalRequestController.java:68) 
    at com.marklogic.xcc.impl.handlers.AbstractRequestController.runRequest(AbstractRequestController.java:72) 
    at com.marklogic.xcc.impl.SessionImpl.submitRequest(SessionImpl.java:280) 
    at com.marklogic.markLogics.main(test.java:34) 

: 코드를 실행하는 동안

package com.marklogic; 
import java.net.URI; 
import java.net.URISyntaxException; 
import com.marklogic.xcc.ContentSource; 
import com.marklogic.xcc.ContentSourceFactory; 
import com.marklogic.xcc.Session; 
import com.marklogic.xcc.Request; 
import com.marklogic.xcc.ResultSequence; 
import com.marklogic.xcc.exceptions.RequestException; 
import com.marklogic.xcc.exceptions.XccConfigException;** 

class markLogics { 
public static void main(String args[]) throws XccConfigException, 
     RequestException { 
    URI uri = null; 
    try { 
     uri = new URI("xcc://user:[email protected]:8008/Marklogics"); 
     // uri=new URI(""); 
    } catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String queryResult = ""; 
    ContentSource contentSource = ContentSourceFactory 
      .newContentSource(uri); 
    Session session = contentSource.newSession(); 
    String queryStr = "let $uri := xdmp:get-request-field(\"uri\")" 
      + "return" 
      + "if (empty($uri) or $uri eq\"\") then" 
      + "(" 
      + " xdmp:set-response-content-type(\"\text/html\")," 
      + "<ul>" 
      + "{for $i in collection()" 
      + "let $doc := document-uri($i) return" 
      + "<li>" 
      + "<a href=" 
      + "\"view.xqy?uri={xdmp:url-encode($doc)}\"" 
      + " >{$doc}</a></li>" 
      + "}</ul>)" 
      + "else ( xdmp:set-response-content-type(\"text/xml\"), if (empty(doc($uri)))" 
      + "then <error>No content" + "</error> else doc($uri) )"; 
    // String 
    // queryStr="let $uri := xdmp:get-request-field(\"uri\")for $v in $doc//uri $a in $doc//play"; 
    Request request = session.newAdhocQuery(queryStr); 
    try { 
     ResultSequence rs = session.submitRequest(request); 
     System.out.println(rs.asString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    session.close(); 
} 

}

을, 그 예외가 이해 :

쿼리에 대한 이해에 따르면 예외를 던지고있는 view.xqy 파일을 사용해야합니다.

접근 방식 : view.xqy을 보관하여이 문제를 극복하기 위해 다음과 같은 방법을 시도했지만 프로젝트 경로를 수정했지만 도움이되지 않습니다.

딸꾹질을 극복하기위한 지침을 제공해 주시겠습니까?

답변

1

문제가 Java 문자열 연결과 관련이 있다고 의심되는 순간 : 예를 들어 queryStr에 "return"과 "if ..."사이에 공백이 없습니다. queryStr의 각 구성 요소는 공백으로 시작하거나 끝나야합니다.

그러나 Java 대신 원시 HTTP를 사용하여 한 걸음 더 나아간 간단한 접근 방법을 시도하는 것이 좋습니다. 링크 목록을 렌더링하는 인덱스 페이지가있는 웹 응용 프로그램을 만드는 것처럼 보입니다. 당신은 아마도 순수한 HTTP에서 더 쉽게 할 수 있습니다.

그래서 나는 index.xqy 파일로 queryStr XQuery를 이동하고 HTTPServermodules root에서 해당 파일을 배치합니다. 동일한 위치에 view.xqy을 입력하십시오. 일반 웹 브라우저를 사용하여 http://HOSTNAME:PORT/에 연결하고 올바른 HOSTNAMEPORT을 입력하십시오.

아마도 나중에 Java를 통합해야 할 수도 있지만, 간단한 HTTP 응용 프로그램을 먼저 사용하게되면 자신감에 도움이 될 것입니다.

더 읽기 : 그 위의 생각에 동의

0

당신은 서버에 XQuery를 저장하고 HTTP 통해 호출 오프 훨씬 더 낫다 또는 XCC.

일반적으로 XQuery과 MarkLogic의 일반적인 접근 방식은 응용 프로그램 서버가 가리키는 "루트"영역에 코드를 저장 한 다음 XQuery을 호출하는 것입니다.문자열이 몇 가지 문제를 가지고로 임시는 XQuery을 연결 :

은 입력하지 어렵다 - 아니 구문 강조 나 다른 도구를

XQuery는 매번 다시 해석하기보다는 캐시해야 효율적인 양식

그런 식으로 잘 생각한 XQuery 응용 프로그램을 만들 수는 없습니다. XQuery 코드 조직에 대한 모듈을 가지고 있으며, 당신은 당신이 당신의 XQuery 코드를 분리 할 경우 특정 XML 요소와 속성뿐만 아니라, 호출 기능을 위해 별도로 XQuery를 검색하고 그렇다 코딩,

XQuery 순수하게 기능적인 서버를 유지할 수 있습니다 자연스럽고 상호 작용적이고 반복적 인 기능을 제공합니다. 이는 cq 또는 queryConsole과 같은 양방향 쿼리 버퍼에서 훨씬 쉽게 MarkLogic과 함께 패키지됩니다.

관련 문제