2

我有一个 65Mb XML 文件,我正在使用 PUGIXML 加载和修改它。问题是我需要保持更新并保存到磁盘,以便其他文件可以访问。我不想实现数据库,那么有没有办法让我进行修改,只保存这些修改,而不是将整个文档转储到文件中?每次保存 xml 文件时,我都会注意到大约 3-4 秒的延迟。

4

1 回答 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 回答