我有一个 65Mb XML 文件,我正在使用 PUGIXML 加载和修改它。问题是我需要保持更新并保存到磁盘,以便其他文件可以访问。我不想实现数据库,那么有没有办法让我进行修改,只保存这些修改,而不是将整个文档转储到文件中?每次保存 xml 文件时,我都会注意到大约 3-4 秒的延迟。
问问题
708 次
1 回答
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 函数是用相对较大的块调用的(大小通常是几千字节,除了最后一个可能很小的块),因此在实现中通常不需要额外的缓冲。
还有另一种方法可以解决这个问题:一次保存一个子树。同样,从文档中:
为了保存单个子树,提供了以下函数:
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 接口的对象。
于 2015-06-16T07:55:38.857 回答