从XML中只读root-element

时间:2015-02-25 13:27:43

标签: c# xml linq-to-xml xmldocument

我有一个非常大的xml文件(假设它有大约300000个元素)。在我的应用程序中,我只需要知道根元素的名称是ApplicationLog以及根元素中是否有一个名为LogId的属性。

要阅读我使用的XML:

XDocument document;
using (StreamReader streamReader = new StreamReader(filePath, true))
{   
    document = XDocument.Load(streamReader);
}

并获取我需要的信息:

try
{
    if (document.Root != null)
    {       
        if (string.Equals(document.Root.Name.LocalName, "ApplicationLog", StringComparison.InvariantCultureIgnoreCase) &&
            document.Root.HasAttributes && (from o in document.Root.Attributes() where string.Equals(o.Name.LocalName, "LogId", StringComparison.InvariantCultureIgnoreCase) select o).Any())
        {
            isRelevantFile = true;
        }
    }
}
catch (Exception e)
{
}

这很好用。

问题是XDocument.Load加载大约20MB的XML文件大约需要15秒。

我也尝试了XmlDocument,但我遇到了同样的问题。

我对解决方案的第一个想法是将文件作为文本读取并解析搜索到的元素/属性的第一行。但这对我来说似乎并不那么专业。

有人知道更好的方法吗?

2 个答案:

答案 0 :(得分:3)

XmlReader API与

一起使用
using (XmlReader xr = XmlReader.Create(filePath))
{
  xr.MoveToContent();
  if (xr.LocalName == "ApplicationLog" ...)

}

答案 1 :(得分:0)

您可以尝试使用here提供的解决方案,或使用/开发SAX阅读器,例如this one。您可以在SAX here找到更多信息。