如何使用Xml文件而不将整个文档加载到内存中?

时间:2012-05-23 11:48:07

标签: c# xml

如何添加新节点,更新现有节点并删除xml文档的现有节点而不将整个文档加载到内存中?

我有一个xml文档并将其视为我的应用程序的内存,因此需要能够快速完成数百次读取和写入而无需加载整个文档。

它的结构是这样的:

<spiderMemory>
  <profileSite profileId="" siteId="">
    <links>
      <link>
        <originalUrl></originalUrl>
        <isCrawled></isCrawled>
        <isBroken></isBroken>
        <isHtmlPage></isHtmlPage>
        <firstAppearedLevel></firstAppearedLevel>
      </link>
    </links>
  </profileSite>
</spiderMemory>

如何使用XDocument实现这一目标?

由于

3 个答案:

答案 0 :(得分:5)

如果您想快速进行数百次读写操作......您可能使用了错误的技术。您是否尝试过使用普通的旧RDBMS?

如果您仍需要XML表示,则可以创建导出方法以从数据库中生成它。

XML并不是这类问题的良好替代品。只是说。

此外......将整件事记忆在内存中有什么问题?它有多大可能得到?说1GB?吸吮它。说1TB?哎呀。但是,在那种情况下,XML是错误的,错误的,错误的;)太冗长了!

答案 1 :(得分:0)

您可以使用XmlReader,如下所示:

FileStream stream = new FileStream("test.xml", FileMode.Open);
XmlReader reader = new XmlTextReader(stream);
while(reader.Read())
{
  Console.WriteLine(reader.Value);
}

这是一个更详细的例子http://msdn.microsoft.com/en-us/library/cc189056%28v=vs.95%29.aspx

答案 2 :(得分:0)

正如Daren Thomas所说,正确的解决方案是根据您的需要使用RDBMS而不是XML。我有一个使用XML和Java的部分解决方案。 Stax解析器不解析内存中的整个文档,并且比DOM快得多(仍然XML解析总是很慢)。一个&#39;拉解析器&#39; (例如Stax)允许你控制解析的内容。一种不太清晰的方法是在获得所需元素时在SAX解析器中抛出异常。

要修改,最简单(但很慢)的方法是使用XPath。另一个(未经测试)选项是将XML文件视为文本,然后&#39;搜索并替换&#39; 内容。在这里,您可以使用各种文本搜索优化。