2012-01-29 49 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)中更容易。