我正在尝试使用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毫秒内执行
但是没有任何内容变成文件。是否有提交更改的命令?
答案 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());
}
这是服务的记录。