2012-01-29 50 views
1

我創建了Xdbc數據庫連接並運行了成功的示例程序。 我已經創建markLogics.java類和進口的jar文件marklogic-xcc-4.0.1.jar獲取「XQueryException」,意外的標記語法錯誤

代碼快照:當執行代碼

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(); 
} 

}

,我得到異常:

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) 

瞭解:

根據我在查詢中的理解,我已致電使用拋出異常的view.xqy文件。

方法跟隨: 我試過以下方法來解決這個問題,將view.xqy歸檔並添加到項目的構建路徑中,但它並沒有幫助我。

你能給我一些指導來克服打嗝嗎?

回答

1

目前我懷疑你的問題與Java字符串連接有關:例如,queryStr中的「return」和「if ...」之間沒有空格。 queryStr的每個組件可能需要以某些空格開始或結束。

但是,退一步嘗試一種更簡單的方法,使用本地HTTP代替Java可能會更好。它看起來像你正在嘗試構建一個Web應用程序,並帶有一個呈現鏈接列表的索引頁面。您可能會發現在純HTTP中更容易。

所以,我將你的queryStr的XQuery到index.xqy文件,並將其放置在HTTPServermodules root該文件。將view.xqy放置在相同的位置。使用普通的網絡瀏覽器連接到http://HOSTNAME:PORT/,填寫正確的HOSTNAMEPORT

可能您需要稍後集成Java,但是如果您首先使用簡單的HTTP應用程序,我認爲這將有助於您的信心。

更多閱讀:

0

我上面說的想法同意你好得多的服務器上存儲XQuery和通過HTTP調用它或XCC

XQuery通常和MarkLogic的典型方法是將代碼存儲在Application Server指向的「根」區域,然後只需調用XQuery即可。串聯特設 XQuery作爲字符串有幾個問題:

很難型 - 無語法高亮或其他工具

XQuery必須重新分析每一次,而不是緩存在一個高效的形式

你不能用這種方式構建一個深思熟慮的XQuery應用程序。 XQuery有代碼組織模塊,並且可以單獨搜索您的XQuery特定XML元素和屬性,以及調用的函數,如果你分開你的XQuery代碼,並保持它的服務器

XQuery是純功能性的,所以編碼是自然交互和迭代,這在與MarkLogic打包在一起的交互式查詢緩衝區(例如cq或queryConsole)中更容易。