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

C# 如何在不将整个文档加载到内存的情况下处理Xml文件?,c#,xml,C#,Xml,如何在不将整个文档加载到内存的情况下添加新节点、更新现有节点和删除xml文档的现有节点 我有一个xml文档,并将其视为应用程序的内存,因此需要能够在不加载整个文档的情况下快速执行数百次读写操作 其结构如下: <spiderMemory> <profileSite profileId="" siteId=""> <links> <link> <originalUrl></originalUrl

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

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

其结构如下:

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

XDocument如何实现这一点


谢谢

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

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

下面是一个更详细的示例,您可以使用XmlReader,如下所示:

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

如果您想快速执行数百次读写操作,这里有一个更详细的示例

。。。您可能使用了错误的技术。您是否尝试过使用普通的旧RDBMS

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

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


还有。。。把整件事都记在记忆里有什么不对?它能有多大?比如1GB?把它吸起来。比如说1TB?哎呀。但在这种情况下,XML是错误的,错误的,无论如何都是错误的;)太冗长了

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

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

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


还有。。。把整件事都记在记忆里有什么不对?它能有多大?比如1GB?把它吸起来。比如说1TB?哎呀。但在这种情况下,XML是错误的,错误的,无论如何都是错误的;)太冗长了

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


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

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


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

这可能会有帮助:这可能会有帮助:谢谢。我无法为此创建单独的数据库,如果我使用现有的prod数据库,成千上万的请求会降低生产用户的数据库速度。该应用程序的第一个版本使用了内存,我们有200个站点和配置文件组合,每个站点和配置文件都应该被爬网到20个内部级别,因此您可以想象它会很快上升到内存的GBs。用xml做这件事你不会高兴的。对不起,谢谢。我无法为此创建单独的数据库,如果我使用现有的prod数据库,成千上万的请求会降低生产用户的数据库速度。该应用程序的第一个版本使用了内存,我们有200个站点和配置文件组合,每个站点和配置文件都应该被爬网到20个内部级别,因此您可以想象它会很快上升到内存的GBs。用xml做这件事你不会高兴的。很抱歉