Запись обновлений в 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

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