2010-12-15 49 views
2

我有一個大型的100MB左右的XML文檔。我需要在這個文檔中找到兩個標籤的屬性。我可以通過使用類似的代碼如下做到這一點:在大型XML文檔中查找特定屬性

XmlDocument xmlDocument = new XmlDocument (); 
xmlDocument.Load ("C:\\myxml.xml"); 

XmlNode node1 = xmlDocument.SelectSingleNode ("/data/objects[@type='data type 1']"); 
if (null != node1) 
{ 
    result = node1 [ "Version" ].Value; 
} 

但這樣做加載整個XML到內存中,這似乎需要大約200MB。無論如何,我可以讓這個更有效率嗎?

編輯:使用XmlTextReader,我寫我的代碼現在使用很多很好的答案。 (它會更有記憶效率,但很難看:)。

+0

我可以發表你的基礎的XmlReader-例子,但我需要知道你正在使用的.NET版本。 – TToni 2010-12-15 13:09:17

+0

我正在使用.Net 3.5 – Kyle 2010-12-15 13:17:27

回答

4

對於性能,SAX比DOM好得多,因爲實際上只需要一個值。 .NET Framework中的SAX實現是XmlTextReader

+0

+1:XmlTextReader很棒(對於Zenox,XmlTextReader是XmlReader的實現,它是一個抽象類):) – LaGrandMere 2010-12-15 13:08:14

3

您應該嘗試使用XmlReader。

MSDN

像SAX讀者,向XMLReader是隻進,只讀遊標。它提供對輸入的快速非緩存流訪問。它可以讀取流或文檔。它允許用戶提取數據,並跳過應用程序不感興趣的記錄。最大的區別在於SAX模型是一個「推」模型,解析器將事件推送到應用程序,每次讀取新節點時通知應用程序,而使用XmlReader的應用程序可以從讀取器將。

示例here

+0

+1。用於引用相關信息和**例子**。 – Aliostad 2010-12-15 13:21:18

1

您可以使用XmlReader類來執行此操作。上面確實與您的代碼的簡單,但工作示例如下:

string result = null; 

using (var reader = XmlReader.Create(@"c:\\myxml.xml")) 
{ 
    while (reader.Read()) 
    { 
     if (reader.NodeType == XmlNodeType.Element 
      && reader.Depth == 1 
      && reader.LocalName == "objects" 
      && reader.GetAttribute("type") == "data type 1") 
     { 
      result = reader.GetAttribute("Version"); 
      break; 
     } 
    } 
}