在大型XML文档中查找特定属性

时间:2010-12-15 12:59:55

标签: c# xml xmldocument

我有一个大约100mb的大型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获得了很多很好的答案,我已经编写了我的代码。 (这将更有效,但丑陋:)。

3 个答案:

答案 0 :(得分:4)

对于性能,SAX比DOM要好得多,因为实际上只需要一个值。 .NET Framework中的SAX实现是XmlTextReader

答案 1 :(得分:3)

您应该尝试使用XmlReader。

来自MSDN

与SAX阅读器类似,XmlReader是一个只进,只读游标。它提供对输入的快速,非缓存流访问。它可以读取流或文档。它允许用户提取数据,并跳过对应用程序不感兴趣的记录。最大的区别在于SAX模型是一个“推送”模型,解析器将事件推送到应用程序,每次读取新节点时通知应用程序,而使用XmlReader的应用程序可以从读取器读取节点将

示例here

答案 2 :(得分: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;
        }
    }
}