如何添加新节点,更新现有节点并删除xml文档的现有节点而不将整个文档加载到内存中?
我有一个xml文档并将其视为我的应用程序的内存,因此需要能够快速完成数百次读取和写入而无需加载整个文档。
它的结构是这样的:
<spiderMemory>
<profileSite profileId="" siteId="">
<links>
<link>
<originalUrl></originalUrl>
<isCrawled></isCrawled>
<isBroken></isBroken>
<isHtmlPage></isHtmlPage>
<firstAppearedLevel></firstAppearedLevel>
</link>
</links>
</profileSite>
</spiderMemory>
如何使用XDocument实现这一目标?
由于
答案 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; 内容。在这里,您可以使用各种文本搜索优化。