大家好我想知道在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;
有更好的方法吗?
答案 0 :(得分:1)
如果您只是从头到尾阅读Xml,则XmlReader是适当的类。 XDocument和XmlDocument适用于将整个文档保留在内存中。 What is the best way to parse (big) XML in C# Code?
但是:对于@Joel Koerner来说,首先必须证明XDocument是这里的瓶颈。虽然很有可能,但我以前从来没有必要管理过大的Xml文件。