3

我正在尝试编写一个 XML 文件,但它太大而无法存储在内存中,因此我想直接将其写入磁盘。我曾尝试使用 XmlWriter,但没有使我能够附加到文件末尾的功能,因此我愿意求助于使用常规文件编写器编写 XML 原始文件。

有谁知道任何使我能够直接写入磁盘并且使我能够覆盖文件内的位置的文件写入类?

原因是我需要能够覆盖根元素的关闭,以便我可以附加另一位信息,而且还能够在需要时读取 XML 文件。例如,如果我有以下 XML:

<elements>
  <element>
  </element>
</elements>

如果我想读这个,我可以,但如果我想写它,我必须先删除</elements>标签,附加另一个元素,然后再次附加结束标签。

谢谢你的帮助。

4

2 回答 2

4

可以使用 XmlTextWriter。

只需打开文件进行写入,返回到结束元素的开头,然后使用 XmlTextWriter 附加您想要的任何新元素。要关闭文件,只需为 end 元素编写原始文本以使文档完整,然后您就完成了。

这是一个快速而肮脏的例子。

像这样从 XML 开始:

<?xml version="1.0" encoding="utf-8"?>
<DocumentElement>
    <FirstElem/>
</DocumentElement>

您可以打开它并附加这样的元素:

using (FileStream f = new FileStream(@"D:\a.xml", FileMode.OpenOrCreate, FileAccess.Write))
{
    f.Seek(-("</DocumentElement>\n".Length), SeekOrigin.End);
    using (XmlTextWriter x = new XmlTextWriter(f, Encoding.UTF8))
    {
        x.WriteStartElement("Another");
        x.WriteAttributeString("attr", "value");
        x.WriteEndElement();

        // Close the file with a new terminating end-element
        x.WriteRaw("\r\n</DocumentElement>\r\n");
    }
}

结果是:

<?xml version="1.0" encoding="utf-8"?>
<DocumentElement>
    <FirstElem/>
<Another attr="value" />
</DocumentElement>

您可能无法获得完美的缩进等,但它是有效的 XML。如果将 xml 作为原始文本写入文件,这正是您要做的 - 但您也可以利用 XML 编写器为您进行格式化。

我也同意一些评论 - 为您的 xml 使用最小化大小的模式将非常有益。关闭缩进。尽可能使用最短的元素和属性名称。如果您正在处理叶子元素,将数据存储为属性而不是 cdata 将节省空间(<element>data</element>比它更昂贵,<element val="data"/>并且可以进一步压缩到<e v="data"/>- 几乎是原始大小的一半)

于 2012-04-20T20:47:44.440 回答
1

我假设(正如@payo 的评论所建议的那样)您可以使用文件流、XmlTextReader(将流定位在适当的元素处)和XmlWriter的组合来编写新元素,然后重新编写结束元素。

于 2012-04-20T20:22:41.363 回答