eXist-db получает данные из множества XML одной и той же коллекции

Я новичок в использовании eXist-db. Используя Java/Groovy, я пытаюсь (без удачи) получить данные из коллекции, которую я создал: /db/apps/compositions,

В /db/apps/compositions пара XML-документов, которые выглядят примерно так:

<version xmlns="http://schemas.openehr.org/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ORIGINAL_VERSION">
  ...
  <data xsi:type="COMPOSITION" archetype_node_id="openEHR-EHR-COMPOSITION.signos.v1">
    <name>
      <value>xxxxx</value>
    </name>
    ...
  </data>
</version>

Я использую XQJ API в моем коде на стороне клиента. Я попытался адаптировать пример кода (из http://en.wikipedia.org/wiki/XQuery_API_for_Java и http://xqj.net/exist/):

XQDataSource xqs = new ExistXQDataSource();
xqs.setProperty("serverName", "localhost");
xqs.setProperty("port", "8080");

XQConnection conn = xqs.getConnection("user","pass");

XQExpression expr = conn.createExpression();

XQResultSequence result = expr.executeQuery(
  "for $n in fn:collection('/db/apps/compositions')//data " +
  "return fn:data($n/name/value)"); // execute an XQuery expression

// Process the result sequence iteratively
while (result.next()) {
  // Print the current item in the sequence
  System.out.println("Product name: " + result.getItemAsString(null));
}

// Free all resources created by the connection
conn.close();

Я ожидал получить тексты ххххх из всего XML-документа в /db/apps/compositions сбор, но я не получаю никаких результатов и никаких исключений.

Есть идеи?

Большое спасибо!

Кстати, я пытался найти другие способы реализации Java-клиента, но не смог найти четкого руководства или учебника для начинающих.

1 ответ

Проблема у вас все о пространствах имен; ваш элемент находится в пространстве имен по умолчанию, поэтому вам нужно определить это пространство имен в запросе.

xquery version "3.0";

declare default element namespace "http://schemas.openehr.org/v1";

for $n in fn:collection('/db/apps/compositions')//data

return fn:data($n/name/value)

читайте больше, например, в технической вики

В общем, я бы рекомендовал сначала протестировать запросы в превосходной IDE eXide, прежде чем объединять их в код. Среда IDE обеспечивает быструю обратную связь с результатами запросов, поэтому вы можете немного поиграть со своими запросами.

Обратите внимание, что написание

*:data

может замедлить запросы на больших наборах данных.

Другие вопросы по тегам