2009-09-10 100 views
6

Tengo varios archivos XML bastante grandes que representan datos exportados desde un sistema que debe ser utilizado por un proveedor de terceros. Estaba recortando los resultados en 2.500 registros para cada archivo XML porque los archivos se vuelven enormes e inmanejables de lo contrario. Sin embargo, el proveedor de terceros me ha pedido que combine todos estos archivos XML en un solo archivo. ¡Hay 78 de estos archivos XML y suman más de 700 MB de tamaño! Loco, lo sé ... entonces, ¿cómo harías para combinar estos archivos para acomodar al vendedor usando C#? Con suerte hay una manera eficaz real para hacer esto sin la lectura de todos los archivos a la vez utilizando LINQ :-)¿Cuál es la forma más eficiente en C# para unir más de 2 archivos xml con el mismo esquema?

Respuesta

4

Voy a salir en un miembro aquí y asumir que su xml se ve algo como:

<records> 
    <record> 
    <dataPoint1/> 
    <dataPoint2/> 
    </record> 
</records> 

Si ese es el caso, abriría una secuencia de archivos y escribiría la parte <records>, luego abriría secuencialmente cada archivo XML y escribiría todas las líneas (excepto la primera y la última) en el disco. De esta manera, no tienes grandes cadenas en la memoria y todo debe ser muy, muy rápido para codificar y ejecutar.

public void ConsolidateFiles(List<String> files, string outputFile) 
{ 
    var output = new StreamWriter(File.Open(outputFile, FileMode.Create)); 
    output.WriteLine("<records>"); 
    foreach (var file in files) 
    { 
    var input = new StreamReader(File.Open(file, FileMode.Open)); 
    string line; 
    while (!input.EndOfStream) 
    { 
     line = input.ReadLine(); 
     if (!line.Contains("<records>") && 
      !line.Contains("</records>")) 
     { 
     output.Write(line); 
     } 
    } 
    } 
    output.WriteLine("</records>"); 
} 
+0

Esta será la forma más rápida, pero es un poco 'hacky'. –

+0

De acuerdo, 'hacky' en el mejor de los casos: p El DataSet.Merge parece mucho más elegante, pero no tengo idea de lo eficiente que sería la memoria. – JustLoren

+0

Tengo el esquema horneado en cada archivo XML, por lo que esto sería aún más 'hacky' –

2

Uso DataSet.ReadXml(), DataSet.Merge(), y DataSet.WriteXml(). Deje que el marco haga el trabajo por usted.
Algo como esto:

public void Merge(List<string> xmlFiles, string outputFileName) 
    { 
    DataSet complete = new DataSet(); 

    foreach (string xmlFile in xmlFiles) 
    { 
     XmlTextReader reader = new XmlTextReader(xmlFile); 
     DataSet current = new DataSet(); 
     current.ReadXml(reader); 
     complete.Merge(current); 
    } 

    complete.WriteXml(outputFileName); 
    } 

Para una descripción más detallada y ejemplos, echar un vistazo a this article de Microsoft.

+0

Esta fue la ruta original que tomé. ¡El problema fue que el proceso terminó usando más de un gig de RAM! –

Cuestiones relacionadas