Estoy trabajando con un conjunto de datos muy grande, por lo que es necesario escribir registros a un archivo XML uno a la vez.

He probado este código:

using (FileStream retryFile = System.IO.File.Create(filePath))
{
    var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
    var ser = new XmlSerializer(typeof(Record));

    foreach(var item in veryLargeEnumerable)
    {
        ser.Serialize(retryFile, item, emptyNamespaces);
    }
}

Esto escribe el registro, pero entre cada registro, agrega:

<?xml version="1.0"?>

Cuando intento leer el archivo, obtengo un error de formato no válido.

¿Cómo puedo serializar los objetos uno a la vez para XML?

0
Guerrilla 25 jun. 2019 a las 19:35

1 respuesta

La mejor respuesta

El código que se muestra en su pregunta genera una jerarquía xml no válida;
No contiene un solo elemento raíz, ya que cada <Record> se escribe en el nivel de raíz, por ejemplo::

<?xml version="1.0"?>
<Record>
  <Name>foo</Name>
</Record><?xml version="1.0"?>
<Record>
  <Name>bar</Name>
</Record><?xml version="1.0"?>
<Record>
  <Name>baz</Name>
</Record>

Tendrá que construir un solo elemento raíz primero. Use una {{x0} } para hacerlo, y luego usar ese mismo XmlWriter como objetivo para serializar los registros en.

using (FileStream retryFile = System.IO.File.Create(filePath))
using (var xmlWriter = XmlWriter.Create(retryFile))
{
    xmlWriter.WriteStartElement("Records");

    var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
    var ser = new XmlSerializer(typeof(Record));

    /* Your loop goes here. */ 

    ser.Serialize(xmlWriter, new Record { Name = "foo" }, emptyNamespaces);
    ser.Serialize(xmlWriter, new Record { Name = "bar" }, emptyNamespaces);
    ser.Serialize(xmlWriter, new Record { Name = "baz" }, emptyNamespaces);

    xmlWriter.WriteEndElement();
}

public class Record 
{ 
    public string Name {get; set; } 
}

El xml se vea a continuación, que tiene un solo elemento raíz <Records> que contiene los elementos infantiles <Record>.

<?xml version="1.0" encoding="utf-8"?>
<Records>
    <Record><Name>foo</Name></Record>
    <Record><Name>bar</Name></Record>
    <Record><Name>baz</Name></Record>
</Records>
0
pfx 25 jun. 2019 a las 17:07