2014-12-16 7 views
0

У меня есть file.xml хранящий протоколы, структура которых следующее:обновления Запись в XML-файл с помощью XQuery и Basex

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<economato> 
    <protocollo> 
    <numero>1</numero> 
    <data>2014-12-15</data> 
    <oggetto>Trasmissione prospetti di rendiconto chiusura esercizio 2012 - beni mobili proprietà dello stato</oggetto> 
    <destinatario>Ragioneria Provinciale Como</destinatario> 
    <operatore>MAESTRI</operatore> 
    <valido>true</valido> 
    </protocollo> 
    ... 
</economato> 

и я должен был бы изменить/обновить значение тега «valido», например, от «true» до «false» в протоколе номер 1, и я хотел бы, чтобы это обновление было записано в файл. Как я использую Basex, следуя документации, которую я попытался написать этот запрос:

xquery let $update := doc('C:\Users\Lorenzo Enzino Vinci\Desktop\ECONOMATO\databases\2014.xml')//economato/protocollo[numero = 1] return replace value of node $update/valido with 'false' into doc('C:\Users\Lorenzo Enzino Vinci\Desktop\ECONOMATO\databases\2014.xml')//economato 

, но я получаю сообщение об ошибке, как

[XPST0003] Unexpected end of query: 'into doc('C:\Users\Lorenzo Enzino Vinci\Desktop\ECONOMATO\databases\2014.xml')//economato' 

Так что мой запрос неправильно, но я не знаю, где. Вы можете мне помочь?

ответ

1

Это не удается, поскольку это недопустимый синтаксис XQuery Update. Нет команды replace ... with ... into ..., там только replace ... with ..., как уже указывает сообщение об ошибке. Это также было бы нелогично, потому что $update уже содержит ссылку на правильный фрагмент xml.

Таким образом, вы просто должны использовать следующий запрос XQuery:

let $update := doc('C:\Users\Lorenzo Enzino Vinci\Desktop\ECONOMATO\databases\2014.xml')//economato/protocollo[numero = 1] 
return replace value of node $update/valido with 'false' 

Кроме того, обратите внимание, что обновления не автоматически записываются обратно в файлы в файловой системе (во избежание случайной перезаписи файлов), например начиная с basex -u. Это подробно объясняется в BaseX wiki

+0

Спасибо. Теперь это яснее. Еще один вопрос: я должен отправить этот запрос через BaseXClient.java в моем приложении Java. Как я могу активировать опцию -u из java-кода? –

+0

Я думаю, что мы должны использовать команду «SET WRITEBACK true» –

+0

Правильно, как объясняется в разделе wiki, с которым я связан. – dirkk

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

  • Нет связанных вопросов^_^