知道在c#中读取大型xml文件的更好方法

时间:2014-07-22 14:57:08

标签: c# xml

大家好我想知道在c#中读取xml文件的更好方法。我有一个4.5 GB的文件,我正在使用StreamReader类。但它太慢了。

以下是我的代码的一部分:

        using (StreamReader s = new StreamReader(NmArquivo))
        StreamReader s = new StreamReader(NmArquivo);
        {
            XDocument xmlFile = XDocument.Load(s);

            IEnumerable<XElement> regsXml = from el in xmlFile.Descendants("ContainedResourceList").Elements(tpObra)
                                            select el;

            seqObra = 0;
            statusProcesso.Value = 0;
            statusProcesso.Maximum = regsXml.Count();
            Application.DoEvents();

            foreach (XElement regXml in regsXml)
            {

                DDExObra obra = new DDExObra();
                obra.Controle = controleDDEx.controle;
                obra.UsuarioInclusao = controleDDEx.UsuarioInclusao;
                obra.SequencialObra = seqObra;
                obra.ResourceReference = string.IsNullOrEmpty((string)regXml.Element("ResourceReference")) ? null : regXml.Element("ResourceReference").Value;
                obra.Title = string.IsNullOrEmpty((string)regXml.Element("ReferenceTitle")) ? null : regXml.Element("ReferenceTitle").Value;
                obra.Duration = string.IsNullOrEmpty((string)regXml.Element("Duration")) ? null : regXml.Element("Duration").Value;
                obra.DsDuration = string.IsNullOrEmpty(obra.Duration) ? null : XmlConvert.ToTimeSpan(regXml.Element("Duration").Value).ToString();
                seqObra++;

                // identificadores
                var q1 = from el in regXml.Elements(tpIdObra)
                         select new
                         {
                             ISRC = string.IsNullOrEmpty((string)el.Element("ISRC")) ? null : el.Element("ISRC").Value,
                             ProprietaryId = string.IsNullOrEmpty((string)el.Element("ProprietaryId")) ? null : el.Element("ProprietaryId").Value,
                             CatalogNumber = string.IsNullOrEmpty((string)el.Element("CatalogNumber")) ? null : el.Element("CatalogNumber").Value
                         };

                var r1 = q1.FirstOrDefault();
                if (r1 != null)
                {
                    obra.ProprietaryId = r1.ProprietaryId;
                    obra.Isrc = r1.ISRC;
                    obra.CatalogNumber = r1.CatalogNumber;
                }
                r1 = null;
                q1 = null;

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您只是从头到尾阅读Xml,则XmlReader是适当的类。 XDocument和XmlDocument适用于将整个文档保留在内存中。 What is the best way to parse (big) XML in C# Code?

但是:对于@Joel Koerner来说,首先必须证明XDocument是这里的瓶颈。虽然很有可能,但我以前从来没有必要管理过大的Xml文件。