Запись обновлений в файл xml с помощью XQuery и BaseX

У меня есть файл .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'

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


person SagittariusA    schedule 16.12.2014    source источник


Ответы (1)


Это не удается, потому что это недопустимый синтаксис обновления XQuery. Команды 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.

person dirkk    schedule 16.12.2014
comment
Спасибо. Теперь стало понятнее. Еще один вопрос: я должен отправить этот запрос через BaseXClient.java в своем Java-приложении. Как я могу активировать опцию -u из java-кода? - person SagittariusA; 16.12.2014
comment
Правильно, как это объяснено в разделе вики, на который я ссылаюсь. - person dirkk; 16.12.2014
comment
Большое спасибо за твою помощь:) - person SagittariusA; 16.12.2014