1

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

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

它的结构是这样的:

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

XDocument 怎么可能做到这一点?

谢谢

4

3 回答 3

5

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

如果您仍然需要 XML 表示,那么您可以创建一个导出方法来从数据库中生成它。

XML 并不能很好地替代这类问题。只是说。

还有……把整件事都记在内存里有什么问题?它可能有多大?说1GB?吸起来。说1TB?哎呀。但是在那种情况下,XML 是错误的,错误的,无论如何都是错误的 ;) 太冗长了!

于 2012-05-23T11:53:50.320 回答
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

于 2012-05-23T11:50:12.680 回答
0

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

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

于 2015-12-04T05:19:31.663 回答