获取“XQueryException”,意外的令牌语法错误

时间:2012-01-29 18:31:03

标签: java exception marklogic

我已创建Xdbc数据库连接并运行示例程序,但它已成功完成。 我创建了类markLogics.java并导入了jar文件marklogic-xcc-4.0.1.jar

代码快照:

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:pwd@localhost: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并将其添加到项目的构建路径中来克服这个问题,但它并没有帮助我。

你能否给我一些指导来克服打嗝?

2 个答案:

答案 0 :(得分:1)

目前我怀疑你的问题与Java字符串连接有关:例如,queryStr中的“return”和“if ...”之间没有空格。 queryStr的每个组件可能需要以某个空格开头或结尾。

但是回过头来尝试一种更简单的方法可能会更好,原生HTTP而不是Java。在我看来,你正在尝试构建一个Web应用程序,其中一个索引页面呈现一个链接列表。您可能会发现在纯HTTP中更容易做到。

因此,我会将您的queryStr XQuery移到index.xqy文件中,并将该文件放在modules root的{​​{1}}中。将HTTPServer放在同一位置。使用普通网络浏览器连接到view.xqy,填写正确的http://HOSTNAME:PORT/HOSTNAME

稍后您可能需要集成Java,但我认为如果您首先使用简单的HTTP应用程序,它将有助于您的信心。

更多阅读:

答案 1 :(得分:0)

我同意上述想法,您最好不要在服务器上存储XQuery并通过HTTPXCC调用它。

XQuery通常和MarkLogic的典型方法是将代码存储在Application Server指向的“根”区域中,然后只调用XQuery。将 ad-hoc xquery连接为字符串有一些问题:

很难输入 - 没有语法高亮或其他工具

每次都必须重新解析XQuery,而不是以有效的形式缓存

您无法以这种方式构建经过深思熟虑的XQuery应用程序。 XQuery包含用于代码组织的模块,您可以单独搜索XQuery以查找特定的XML元素和属性,以及在将XQuery代码分开并将其保留在服务器上时调用的函数

XQuery纯粹是功能性的,因此编码自然是交互式和迭代的,这在与MarkLogic一起打包的交互式查询缓冲区(如 cq或queryConsole )中要容易得多。