如何在不将整个文档加载到内存中的情况下处理 Xml 文件

本文关键字:内存 情况下 处理 文件 Xml 加载 文档 | 更新日期: 2023-09-27 18:35:09

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

我有一个 xml 文档并将其视为我的应用程序的内存,因此需要能够在不加载整个文档的情况下快速执行数百次读取和写入。

它的结构是这样的:

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

XDocument怎么可能做到这一点?

谢谢

如何在不将整个文档加载到内存中的情况下处理 Xml 文件

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

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

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

也。。。把整个事情放在记忆里有什么问题?它能有多大?比如说1GB?面对现实吧。比如说 1TB?哎呀。但是在这种情况下,XML是错误的,错误的,无论如何都是错误的;)太啰嗦了!

你可以

使用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

正如Daren Thomas所说,正确的解决方案是使用RDBMS而不是XML来满足你的需要。我有一个使用XML和Java的部分解决方案。Stax 解析器不会解析内存中的整个文档,并且比 DOM 快得多(XML 解析总是很慢)。"拉取解析器"(例如 Stax)允许您控制解析的内容。一种不太干净的方法是在获取所需的元素时在 SAX 解析器中引发异常。

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

相关文章: