2014-12-05 9 views
1

Я пытаюсь использовать XQuery и BaseX для управления некоторыми файлами.xml в качестве баз данных.Запросы обновления XQuery в BaseX успешны, но никаких изменений не записывается в файл

Я использую basexclient для отправки запросов на basexserver. Например, у меня есть простой файл с именем Library.xml, как следующее:

<library> 
    <book>gone with the wind</book> 
    <book>the thornbirds</book> 
</library> 

, и я хотел бы добавить узел, поэтому с basexclient терминала Посылаю:

XQUERY insert node <book>Dracula</book> as last into doc('library.xml')//library 

, а затем я получаю сообщение

Запрос выполнен в 10,5 мс

Но ничего не изменилось в файл. Есть ли команда для внесения изменений?

+1

Вы проверяете исходный файл или базу данных, созданную из него? Если вы создали базу данных, изменения не будут автоматически записаны в файл. 'Doc ('library.xml')' содержит изменения? –

+0

Да, я проверяю исходный файл и не содержит никаких изменений. Я читал документацию basex в течение нескольких дней, но я до сих пор не понял, как это работает. –

+0

В таких случаях я добавил [запрос функции для печати предупреждающего сообщения] (https://github.com/BaseXdb/basex/issues/1041). BaseX действительно не приветствуется (особенно) новыми пользователями в этом случае. –

ответ

2

Выполнение обновлений (последовательных) XML-файлов едва ли возможно. BaseX, а также другие базы данных XML на рынке используют special, internal representations with indexes для быстрого запроса и особенно обновлений.

Если вы уже создали базу данных из файла, ваш запрос обновляет базу данных, а не оригинальный XML-файл. Вы должны быть в состоянии наблюдать изменения (возможно, несколько раз, один узел добавляется для каждой попытки запуска запроса) в представлении базы данных, которые можно проверить, запустив

doc('library.xml') 

и проверить его содержимое. Чтобы сериализовать изменения в файле, используйте BaseX 'EXPORT command.

Если вы еще не создали базу данных и запрашиваете файл на своем жестком диске, создается временная база данных в памяти, которая действительно успешно обновляется, но мгновенно отбрасывается. Create a database перед запуском обновлений.

См. Christian Grün's answer discussing the WRITEBACK option, где вы можете обновить файл без создания баз данных.

4

По умолчанию обновления экземпляров памяти вашего файла не будут распространяться на диск. Вы можете изменить это, включив опцию WRITEBACK. Я согласен с тем, что поведение удивительно; он был введен для предотвращения случайного изменения локальных файлов пользователями.

Общее примечание. Если вы хотите обновлять локальные файлы, может быть лучше использовать BaseX в автономном режиме. Если вы работаете с архитектурой клиент/сервер (т. Е. С basexclient, а не с basex), сервер мог быть запущен из другого рабочего каталога и, возможно, не сможет разрешить относительный путь в вашей функции doc().

1

Я пишу простую службу синхронизации между системой и базой X. У меня есть аналогичная проблема в том, что я выполняю несколько запросов с помощью PHP Client и делаю несколько запросов на одном и том же сеансе или нескольких, которые преуспевают, не показывая результаты, если смотреть с baseX dba. Я открываю, выполняю, получаю результаты, если есть, и закрываю каждый запрос. Если я выполняю каждый запрос отдельно, я получаю результат, обновленный (после обновления) в dba. Я запускаю это как сервис с портом 1894, открытым для localhost. Каждый запрос имеет общий вид

try { 
$myXML22 = 'somegenerated xml' 
$filepathname = "mydoc/mydoc_doc22.xml"; 
$docID = "22"; 
$dbName = "myDB"; 
$input = 'let $xml := \''.$myXML22.'\' '. 
     'return db:replace("'.$dbName.'","'.$filepathname.'",$xml)'; 
$query = $session->query($input); 
$log .= "Updated/added $filepathname to basex db ".$dbName." \n"; 
} catch (Exception $e) { 
    error_log("somemessage".$e->getMessage()); 
} 

Вот протоколирование службы.

  1. Дб MyDB существует в Basex
  2. Найдены 24 mydoc изданий в MyDB дб в Basex
  3. Проверено манифест существует в MyDB дБ в Basex
  4. Найдены 5 записей Timestamp в манифесте MyDB дБ в Basex
  5. Созданный XML для doc22
  6. сверяются ГСЧ для doc22
  7. Обновлено/добавлено myxml/mydoc_doc22.xml к Basex дб MyDB
  8. Введено времяStamp node для mydoc 22 в манифест для basex db myDB
+0

Кажется, что-то связанное с systemd на ubuntu 16.04. Кто-нибудь имеет пример basex.service, который работает? – steve