2010-12-15 79 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; 
     } 
    } 
}