Запись обновлений в XML-файл с XQuery и BaseX
У меня есть файл file.xml для хранения протоколов, структура которого следующая:
<?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