Linq to XML: carga de archivos XML enormes (más de 1Gb)
0 Comments
Estos días he estado bastante liado ya que el proceso que teníamos de carga de XML realizaba una precarga en memoria del archivo (método Load()), la solución que hay es bastante sencilla con un XMLReader, os pongo un fragmento que seguro se entiende:
using (XmlReader reader = XmlReader.Create(directoryTemp + fichero)) { reader.MoveToContent(); int count = 0; // una variable contador XElement nombretabla = null; // un XElement auxiliar while (!reader.EOF) { switch (reader.NodeType) { case XmlNodeType.Element: // se puede filtrar por tipo de XmlNodeType... if (count == 0) { // CUALQUIER CONDICION count++; reader.Read(); } else if (count == 1) { nombretabla = new XElement((XName)reader.Name); // esto para crear un XELEMENT con el nombre del Reader actual count++; reader.Read(); } else { if (string.IsNullOrEmpty(nodoReg)) nodoReg = reader.Name; // condicion para omitir anidados.. if (nodoReg == reader.Name) { count++; nombretabla.Add(XElement.ReadFrom(reader) as XElement); // INSERCION .. cada X lanzo una inserción en BD if (count % numInserciones == 0) { nombrecondicionado.Add(nombretabla); docaux.Add(nombrecondicionado); // VALIDACION ... validado = ValidarEsquema(docaux, esquema); if (validado) { nreg += cond.Insertar(docaux, delete); delete = false; // vacio contenidos nombretabla.Elements().Remove(); nombrecondicionado.Elements().Remove(); docaux.Elements().Remove(); } else { OnReportInformation(string.Format("ERROR fichero{0} no valido.", fichero), ReportLevel.Error); EstadoCarga = 2; } } } } break; default : reader.Read(); break; } } // INSERCION DE LOS ULTIMOS QUE NO ENTRAN EN EL ÚLTIMO WHILE nombrecondicionado.Add(nombretabla); docaux.Add(nombrecondicionado); // VALIDACION validado = ValidarEsquema(docaux, esquema); if (validado) { nreg += cond.Insertar(docaux, delete); // vacio contenidos nombretabla.Elements().Remove(); nombrecondicionado.Elements().Remove(); docaux.Elements().Remove(); } else { OnReportInformation(string.Format("ERROR fichero{0} no valido.", fichero), ReportLevel.Error); EstadoCarga = 2; } } |