2

我正在尝试使用 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 毫秒内执行

但是文件中没有任何变化。是否有提交更改的命令?

4

3 回答 3

4

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

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

于 2014-12-05T12:34:17.130 回答
3

几乎不可能对(序列化的)XML 文件进行高性能更新。BaseX 以及市场上的其他 XML 数据库都使用带有索引的特殊内部表示,以便快速查询,尤其是更新。

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

doc('library.xml')

并检查其内容。要序列化对文件的更改,请使用 BaseX' EXPORTcommand

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

请参阅Christian Grün 的讨论WRITEBACK选项的答案,它使您能够在不创建数据库的情况下更新文件。

于 2014-12-05T12:13:43.067 回答
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. 数据库 myDB 存在于 baseX
  2. 在 baseX 的 myDB db 中找到 24 个 mydoc 版本
  3. 已检查的清单存在于 baseX 的 myDB 数据库中
  4. 在 baseX 的 myDB db 清单中找到 5 个 timeStamp 条目
  5. 为 doc22 创建 XML
  6. 针对 doc22 的 RNG 验证
  7. 将 myxml/mydoc_doc22.xml 更新/添加到 basex db myDB
  8. 将 mydoc 22 的时间戳节点插入到 basex db myDB 的清单中
于 2017-04-07T05:07:15.707 回答