我有方法应该将对象列表保存到 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到这个期望:
“System.InvalidOperationException”类型的未处理异常发生在...
附加信息:处于 EndRootElement 状态的令牌 EndElement 将导致无效的 XML 文档。如果要编写 XML 片段,请确保将 ConformanceLevel 设置设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。
尝试使用 ConformanceLevel.Fragment 但我得到了一个例外,如果我想保存 xml 文件,我应该使用 ConformanceLevel.Auto。
错误信息是:
处于 EndRootElement 状态的令牌 EndElement 将导致无效的 XML 文档。
换句话说,当没有其他东西要关闭时(您已经到达文档根目录),您正在尝试编写结束元素。
因此,看看您关闭任何元素的位置:
writer.WriteEndElement();
writer.WriteEndElement();
Run Code Online (Sandbox Code Playgroud)
你在那里关闭了两个元素,但你只打开了一个元素 ( <Countries>):
writer.WriteStartDocument();
writer.WriteStartElement("Countries");
Run Code Online (Sandbox Code Playgroud)
WriteStartDocument不启动 Xml 元素,它只是编写文档 Xml 声明(例如<?xml version="1.0" encoding="UTF-8"?>)。
删除第二个writer.WriteEndElement();,你应该没问题。