保存xml文件和ConformanceLevel

时间:2014-08-23 08:51:50

标签: c# .net 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();                
            }
        }

我得到了这个说法:

  

未处理的类型&#39; System.InvalidOperationException&#39;   发生在......

     

其他信息:状态EndRootElement中的Token EndElement会   导致XML文档无效。确保ConformanceLevel   设置设置为ConformanceLevel.Fragment或ConformanceLevel.Auto   如果你想写一个XML片段。

尝试使用ConformanceLevel.Fragment,但是如果我想保存xml文件,那么我应该使用ConformanceLevel.Auto。

2 个答案:

答案 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();