使用XQuery和BaseX编写对xml文件的更新

时间:2014-12-16 11:24:54

标签: xml xquery basex xquery-update xquery-3.0

我有一个存储协议的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>

我需要更改/更新标记的值&#34; valido&#34;,例如来自&#39; true&#39;到&#39;假&#39; protocollo编号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 个答案:

答案 0 :(得分: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

中有详细解释