我正在处理非常大的数据集,因此需要一次将记录写入一个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?
答案 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>