我有一个65Mb的XML文件,我正在使用PUGIXML加载和修改。问题是我需要保持更新并保存到磁盘,以便其他文件可以访问。我不想实现数据库,所以有没有办法让我进行修改,只需保存那些修改,而不是将整个文档转储到文件中?每次保存xml文件时都会注意到3-4秒的延迟。
答案 0 :(得分:0)
这是一个老问题。但无论如何,让我回答。
pugixml具有通过write
接口保存数据的模式。这有效地解决了必须转储整个文件的问题,因为您可以将数据块化为较小的块并写入文件。
这是一个带有单个函数的简单接口,可以调用它 在输出过程中多次将文档数据块作为 输入:
class xml_writer { public: virtual void write(const void* data, size_t size) = 0; }; void xml_document::save(xml_writer& writer, const char_t* indent = "\t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
...
使用相对较大的块调用write函数(通常是大小) 几个千字节,除了可能很小的最后一个块),所以 在实现中通常不需要额外的缓冲。
还有一种方法可以解决这个问题:一次保存一个子树。同样,来自documentation:
要保存单个子树,请提供以下功能:
void xml_node::print(std::ostream& os, const char_t* indent = "\t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
void xml_node::print(std::wostream& os, const char_t* indent = "\t", unsigned int flags = format_default, unsigned int depth = 0) const;
void xml_node::print(xml_writer& writer, const char_t* indent = "\t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
这些函数具有相同的参数,其含义与 对应的xml_document :: save函数,并允许您保存 子树到C ++ IOstream或任何实现的对象 xml_writer接口。