2012-05-23 23 views
1

如何添加新节点,更新现有节点并删除XML文档的现有节点,而无需在内存中加载整个文档?如何在不将整个文档加载到内存中的情况下使用Xml文件?

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

它的结构是这样的:

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

怎么会是这样可能的的XDocument?

感谢

+0

这可能会有所帮助:http://stackoverflow.com/questions/1797167/processing-xml-without-loading-entire-document-in-memory –

回答

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

5

...你可能会使用错误的技术。你有没有尝试过使用普通的旧RDBMS?

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

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

另外...整个事情在内存中出现什么问题?它可能有多大?说1GB?把它吸起来。说1TB?哎呀。但是在那种情况下,XML是错误的,错误的,错误的;)方式太冗长了!

+0

谢谢。我无法为此创建单独的数据库,如果使用现有的数据库,数千个请求会减慢生产用户的数据库速度。 –

+0

该应用程序的第一个版本使用了内存,我们有200个站点和配置文件的组合,每个应该被抓取到20个内层,因此您可以将其快速升级到GB的RAM。 –

+1

你将不会乐意在XML中做这件事。抱歉。 –

0

正如Daren Thomas所说,正确的解决方案是使用RDBMS代替XML来满足您的需求。我有一个使用XML和Java的部分解决方案。 Stax解析器不解析内存中的整个文档,并且比DOM快得多(仍然XML解析总是很慢)。 'pull parser'(例如Stax)允许你控制被解析的内容。更简洁的方法是在获取需要的元素时在SAX解析器中抛出异常。

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

相关问题