BaseX中的XQuery Update查询成功,但不会对文件进行任何更改

时间:2014-12-05 11:50:19

标签: xml xquery basex xquery-update

我正在尝试使用XQuery和BaseX来管理一些files.xml作为数据库。

我使用basexclient向basexserver发送查询。例如,我有一个名为library.xml的简单文件,如下所示:

<library>
   <book>gone with the wind</book>
   <book>the thornbirds</book>
</library>

我想添加一个节点,所以从basexclient终端我发送:

XQUERY insert node <book>Dracula</book> as last into doc('library.xml')//library

然后我收到消息

  

查询在10.5毫秒内执行

但是没有任何内容变成文件。是否有提交更改的命令?

3 个答案:

答案 0 :(得分:4)

默认情况下,文件内存实例的更新不会传播回磁盘。您可以通过打开WRITEBACK选项来更改此设置。我同意这种行为令人惊讶;引入它是为了防止用户意外更改本地文件。

一般注意事项:如果要更新本地文件,最好在独立模式下使用BaseX。如果您正在使用客户端/服务器体系结构(即使用basexclient而不是basex),则服务器可能已从其他工作目录启动,并且可能无法解析相对doc()函数中的路径。

答案 1 :(得分:2)

几乎不可能对(序列化的)XML文件进行性能更新。市场上的BaseX和其他XML数据库都使用special, internal representations with indexes进行快速查询,尤其是更新。

如果已从文件中创建数据库,则查询将更新数据库,而不是原始XML文件。您应该能够在数据库表示中观察更改(可能多次,每次尝试运行查询添加一个节点),您可以通过运行

来验证
doc('library.xml')

并检查其内容。要将更改序列化到文件,请使用BaseX“EXPORT command

如果您尚未创建数据库并查询硬盘上的文件,则会创建一个临时的内存数据库,该数据库确实已成功更新 - 但会立即丢弃。在运行更新之前Create a database

请参阅Christian Grün's answer discussing the WRITEBACK option,这样您就可以在不创建数据库的情况下更新文件。

答案 2 :(得分:1)

我在系统和baseX之间编写简单的同步服务。 我有类似的问题,因为我使用PHP客户端进行多次查询,并在同一会话或多个查询上进行多次查询而不显示从baseX dba查看的结果。我打开,执行,获取结果(如果有的话)并关闭每个查询。 如果我单独执行每个查询,我会在dba中更新(刷新后)结果。 我将此作为服务运行,端口1894对localhost开放。 每个查询都具有

的一般形式
try {
$myXML22 = 'somegenerated xml' 
$filepathname = "mydoc/mydoc_doc22.xml";
$docID = "22";
$dbName = "myDB";
$input = 'let $xml := \''.$myXML22.'\' '.
         'return db:replace("'.$dbName.'","'.$filepathname.'",$xml)';
$query = $session->query($input);
$log .= "Updated/added $filepathname to basex db ".$dbName." \n";
} catch (Exception $e) {
  error_log("somemessage".$e->getMessage());
}

这是服务的记录。

  1. Db myDB存在于baseX
  2. 在baseX中的myDB db中找到24个mydoc版本
  3. 在baseX
  4. 中的myDB数据库中存在已检查的清单
  5. 在baseX
  6. 中的myDB数据库清单中找到5个timeStamp条目
  7. 为doc22创建XML
  8. 针对doc22
  9. 针对RNG进行了验证
  10. 将myxml / mydoc_doc22.xml更新/添加到basex db myDB
  11. 将mydoc 22的timeStamp节点插入到basex db myDB的清单中