我有将对象列表保存到xml文件中的方法
private void DumpToXMLFile(List<Url> urls, string fileName)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
settings.NewLineOnAttributes = true;
settings.ConformanceLevel = ConformanceLevel.Auto;
using (XmlWriter writer = XmlWriter.Create(fileName, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("Countries");
foreach (var url in urls)
{
writer.WriteStartElement("Country");
writer.WriteElementString("Name", url.Name);
writer.WriteElementString("Url", url.Uri);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
}
}
我得到了这个说法:
未处理的类型&#39; System.InvalidOperationException&#39; 发生在......
其他信息:状态EndRootElement中的Token EndElement会 导致XML文档无效。确保ConformanceLevel 设置设置为ConformanceLevel.Fragment或ConformanceLevel.Auto 如果你想写一个XML片段。
尝试使用ConformanceLevel.Fragment,但是如果我想保存xml文件,那么我应该使用ConformanceLevel.Auto。
答案 0 :(得分:3)
错误消息是:
状态EndRootElement中的Token EndElement将导致XML文档无效。
换句话说,当没有其他东西要关闭时(你已经到达文档根目录),你正在尝试编写一个结束元素。
因此,请查看关闭任何元素的位置:
writer.WriteEndElement();
writer.WriteEndElement();
您正在关闭两个元素,但只打开一个元素(<Countries>
):
writer.WriteStartDocument();
writer.WriteStartElement("Countries");
WriteStartDocument
不会启动Xml元素,只会写入文档Xml声明(例如<?xml version="1.0" encoding="UTF-8"?>
)。
删除第二个writer.WriteEndElement();
,你应该没问题。
答案 1 :(得分:1)
在最后一个EndElement声明中使用
writer.WriteEndDocument();
而不是writer.WriteEndElement();