Запрос FLWOR в eXist выдает: ошибка синтаксического анализа XML: корневой элемент не найден

#xml #nosql #exist-db #flwor #restxq

#xml #nosql #exist-db #флвор #restxq

Вопрос:

Я пытаюсь адаптировать максимально простой FLWOR BaseX eXist вариант, как показано ниже.

Ошибка в eXist :

 XML Parsing Error: no root element found
Location: http://localhost:8080/exist/rest/db/scripts/notes.xq
Line Number 1, Column 1:
 

Запрос:

 xquery version "3.0";


for $note in collection("/db/temp/notes")


return $note
 

Коллекция:

 <notes>


<note>
foo
</note>


<note>
bar
</note>


<note>
baz
</note>

</notes>
 

От BaseX :

 nicholas@mordor:~/basex$ 
nicholas@mordor:~/basex$ cat notes.xq 

xquery version "3.1";


for $note in db:open("notes")

return $note
nicholas@mordor:~/basex$ 
nicholas@mordor:~/basex$ basex notes.xq
[warning] /usr/bin/basex: Unable to locate /usr/share/java/tagsoup.jar in /usr/share/java
[warning] /usr/bin/basex: Unable to locate /usr/share/java/xml-resolver.jar in /usr/share/java
[warning] /usr/bin/basex: Unable to locate /usr/share/java/jing.jar in /usr/share/java
<notes>
  <note>foo</note>
  <note>bar</note>
  <note>baz</note>
</notes>nicholas@mordor:~/basex$ 
nicholas@mordor:~/basex$ 
 

не уверен, как адаптировать это к eXist описанному выше.

Незначительный момент заключается в том, что это есть 3.0 и eXist используется 3.1 , в противном случае я бы ожидал, что он будет переносимым. Итак, должно быть, какая-то ошибка синтаксиса или конфигурации?

Не уверен, как использовать «консоль» в eXist so из eXide :

a

и

b


этот запрос:

 xquery version "3.0";


for $notes in collection('/db/temp')


return $notes
 

возвращает пустую страницу. Данные находятся в «файле» с именем notes.xml /db/tmp , указанным выше.

Я добавил xml-объявление:

 <?xml version="1.0" encoding="UTF-8" ?>
 

кроме того, в xml документ данных.

Комментарии:

1. Ваша коллекция неверна: collection("/db/tmp")

2. ах, но все та же ошибка no root element .

3. Что произойдет, если вы удалите все и просто запустите этот запрос: xquery version "3.0"; collection("/db/tmp") ? И что произойдет, если вы запустите это: xquery version "3.0"; doc("/db/tmp/notes.xml") ? (т.Е. Исключите ПОТОК)

4. В eXide вы нажимаете кнопку «создать», чтобы создать запрос. Вставьте приведенный выше запрос в окно запроса. Нажмите кнопку «eval». Результаты отображаются в нижнем окне.

5. кстати, eXide — это интерфейс разработки, специфичный для существующей базы данных: вы можете выполнять все свои запросы там для тестирования, и вы можете управлять коллекциями баз данных и документами (удалять, создавать, загружать) через меню eXide -> file -> manage. Я рекомендую вам использовать только eXide, прежде чем каким-либо образом экспериментировать с существующими службами REST. Создайте свой XML-документ в eXide, чтобы eXide мог проверить его структуру. Оттуда переходите к написанию запроса и выполнению его в eXide. Это позволит вам легко перехватывать ошибки на ранней стадии, потому что на данный момент невозможно точно диагностировать ваши проблемы.

Ответ №1:

Похоже, у вас есть два XML-файла в /db/tmp (не /db / temp). Я предполагаю, что note.xml является единым <note>...</note> документом и notes.xml это <notes>...</notes> документ, содержащий три <note>...</note> элемента.

Ошибка, которую вы видите, заключается в том, что вы не запрашиваете какие-либо элементы из коллекции. То есть, как только у вас есть коллекция, вам нужно указать элементы в этой коллекции с помощью инструкции XPath.

Пожалуйста, попробуйте это:

 xquery version "3.0";

for $note in collection('/db/tmp')//note
  return $note
 

«// примечание» получит все <note>...</note> элементы под корневым элементом каждого документа в коллекции. Это должно вернуть три <note>...</note> тега в notes.xml плюс <note>...</note> документ в note.xml .

Если вы измените часть XPath запроса на «/ notes/ note», то вы получите только три из notes.xml документ. Это происходит потому, что note.xml документ не имеет <notes>...</notes> элемента в своем корне.

Вы правы в том, что версия XQuery 3.0 или 3.1 в данном случае не имеет значения. В этом простом запросе нет функций 3.1.

Комментарии:

1. Ошибка синтаксического анализа XML: мусор после расположения элемента документа: localhost:8080/exist/rest/db/scripts/notes.xq Номер строки 7, столбец 1: <примечание> ^

2. В eXide вы можете управлять всеми коллекциями и файлами в БД, используя окно «управление» (меню eXide -> файл -> управление).

3. Ошибка XML Parsing Error: junk after document element связана с тем, что у вас есть плохо сформированный XML-документ.