一次编写XML记录

时间:2019-06-25 16:35:18

标签: c# xml .net-core

我正在处理非常大的数据集,因此需要一次将记录写入一个xml文件。

我尝试了以下代码:

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);
    }
}

这将写入记录,但是在每条记录之间添加:

<?xml version="1.0"?>

当我尝试读取文件时,出现无效的格式错误。

如何一次将一个对象序列化为XML?

1 个答案:

答案 0 :(得分:0)

问题中显示的代码生成无效的xml层次结构;
它不包含单个根元素,因为每个<Record>都是在根级别编写的,例如:

<?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>

首先必须构造一个根元素。 使用XmlWriter进行操作,然后使用与目标相同的XmlWriter将记录序列化为目标。

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; } 
}

xml如下所示,只有一个包含<Records>子元素的根元素<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>