2012-05-23 22 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文件視爲文本,然後'搜索並替換'東西。在這裏您可以使用各種文本搜索優化。

相關問題