保存 xml 文件和 ConformanceLevel

use*_*862 3 .net c# xml

我有方法应该将对象列表保存到 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。

O. *_*per 5

错误信息是:

处于 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();,你应该没问题。