将XML直接写入磁盘并附加元素

时间:2012-04-20 20:16:41

标签: c# xml c#-4.0 file-io xmlwriter

我正在尝试编写一个XML文件,但它太大而无法存储在内存中,因此我想直接写入磁盘。我尝试过使用XmlWriter,但是没有功能可以让我追加到文件末尾,因此我愿意使用常规文件编写器来编写XML raw。

是否有人知道任何文件编写类使我能够直接写入磁盘并使我能够覆盖文件中的位置?

原因是我需要能够覆盖根元素的结束,以便我可以附加另一部分信息,但也能够在需要时读取XML文件。例如,如果我有以下XML:

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

可以使用XmlTextWriter。

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

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

从这样的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"/> - 几乎一半原始大小)

答案 1 :(得分:1)

我认为(正如@ payo的评论建议的那样)你可以使用文件流,XmlTextReader(将流定位在适当的元素)和XmlWriter的组合来编写新元素,然后重写关闭元素。