Editar: Mi traducción de cabeceras XmlLite (incompleta y muy áspero) está disponible en GitHubCómo combinar grandes archivos XML utilizando MSXML SAX en Delphi
¿Cuál es la mejor manera de hacer una simple combinan de documentos masivos XML en Delphi con MSXML sin usar DOM? ¿Debo usar los componentes COM SAXReader y XMLWriter y hay buenos ejemplos?
La transformación es una combinación simple de todos los elementos de contenido de la raíz (Contenedor) de muchos archivos grandes (60 MB +) a un archivo enorme (~ 1 GB).
<Container>
<Contents />
<Contents />
<Contents />
</Container>
tengo que trabajar en el siguiente código C# utilizando un XmlWriter y XmlReaders, pero tiene que ocurrir en un proceso Delphi nativo:
var files = new string[] { @"c:\bigFile1.xml", @"c:\bigFile2.xml", @"c:\bigFile3.xml", @"c:\bigFile4.xml", @"c:\bigFile5.xml", @"c:\bigFile6.xml" };
using (var writer = XmlWriter.Create(@"c:\HugeOutput.xml", new XmlWriterSettings{ Indent = true }))
{
writer.WriteStartElement("Container");
foreach (var inputFile in files)
using (var reader = XmlReader.Create(inputFile))
{
reader.MoveToContent();
while (reader.Read())
if (reader.IsStartElement("Contents"))
writer.WriteNode(reader, true);
}
writer.WriteEndElement(); //End the Container element
}
Ya utilizamos MSXML DOM en otras partes del sistema y no quiero agregar nuevos componentes si es posible.
Así que desea utilizar SAX para evitar el consumo de unos pocos gigas de RAM? ¿Ayuda esta demostración SAX-with-MSXML? http://keith-wood.name/DelphiXML/BookCode/Chapter%2013/index.html –
Sí, Delphi compila solo 32 bits y el envoltorio TXMLDocument basado en DOM para MSXML se bloquea con EOutOfMemory cuando los documentos alcanzan ~ 100MB. – carlmon
Mi opinión es soltar MSXML por completo, y vaya con OmniXML. :-) Debería poder cargar un archivo XML de 1 gig en un proceso de 32 bits, en cualquier motor XML diseñado de forma sana. –