2012-01-29 3 views
1

Я создал соединение с базой данных Xdbc и запустил программу-образец, которая была успешной. Я создал класс markLogics.java и импортировали банку файл marklogic-xcc-4.0.1.jarПолучение «XQueryException», непредвиденная ошибка синтаксиса token

Код Snapshot:

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: например, между «return» и «if ...» нет пробелов между queryStr. Каждый компонент queryStr, вероятно, должен начинать или заканчиваться пробелом.

Но может быть лучше сделать шаг назад и попробовать более простой подход, используя собственный HTTP вместо Java. Мне кажется, что вы пытаетесь создать веб-приложение с индексной страницей, которая отображает список ссылок. Вероятно, вам будет легче работать с чистым HTTP.

Так что я бы переместить queryStr XQuery в index.xqy файл, и поместить этот файл в modules root в качестве HTTPServer. Место view.xqy в том же месте. Используйте обычный веб-браузер для подключения к http://HOSTNAME:PORT/, заполняя правильные HOSTNAME и PORT.

Возможно, вам понадобится интегрировать Java позже, но я думаю, что это поможет вашей уверенности, если вы сначала получите простое приложение HTTP.

Больше чтение:

0

Я согласен с идеей выше, что вы гораздо лучше хранить XQuery на сервере и запустив его через HTTP или XCC.

Типичный подход для XQuery в целом и MarkLogic в частности заключается в том, чтобы сохранить код в «корневой» области, на который указывает сервер приложений, а затем просто вызвать XQuery.Конкатенация одноранговую XQuery как строка имеет несколько проблем:

Трудно не вводить - не подсветка синтаксиса или другой оснастки

XQuery должен быть повторно проанализирован каждый раз, а не кэшируются в эффективная форма

Вы не можете создать хорошо продуманное приложение XQuery таким образом. XQuery имеет модули для организации кода, и вы можете искать Ваш XQuery отдельно для конкретных XML элементов и атрибутов, а также вызываемых функций, если вы разделите ваш XQuery код и сохранить его на сервере

XQuery является чисто функциональным, поэтому кодирование естественно интерактивный и итеративный, что намного проще в интерактивном буфере запросов, таком как cq или queryConsole, которые упакованы вместе с MarkLogic.

Смежные вопросы