【问题标题】:saving xml file and ConformanceLevel保存 xml 文件和 ConformanceLevel
【发布时间】:2014-08-23 08:51:50
【问题描述】:

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

我得到了这个期望:

“System.InvalidOperationException”类型的未处理异常 发生在...

附加信息:处于 EndRootElement 状态的令牌 EndElement 将 导致无效的 XML 文档。确保 ConformanceLevel 设置设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto 如果你想写一个 XML 片段。

尝试使用 ConformanceLevel.Fragment,但遇到异常,如果我想保存 xml 文件,我应该使用 ConformanceLevel.Auto。

【问题讨论】:

    标签: c# .net xml


    【解决方案1】:

    错误信息是:

    处于 EndRootElement 状态的令牌 EndElement 将导致无效的 XML 文档。

    换句话说,当没有其他东西可以关闭时,您正在尝试编写一个结束元素(您已经到达文档根目录)。

    因此,请查看关闭任何元素的位置:

    writer.WriteEndElement();
    writer.WriteEndElement();
    

    您正在那里关闭 两个 元素,但您只打开 一个 元素 (&lt;Countries&gt;):

    writer.WriteStartDocument();
    writer.WriteStartElement("Countries");
    

    WriteStartDocument 不启动 Xml 元素,它只是编写文档 Xml 声明(例如 &lt;?xml version="1.0" encoding="UTF-8"?&gt;)。

    删除第二个writer.WriteEndElement(); 应该没问题。

    【讨论】:

      【解决方案2】:

      在最后一个 EndElement 声明中使用

       writer.WriteEndDocument();  
      

      而不是writer.WriteEndElement();

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 2011-10-10
        • 1970-01-01
        • 2017-11-18
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 2010-12-25
        相关资源
        最近更新 更多