c# - 连续的 XML 序列化原因 - EndRootElement 状态下的 token StartElement 将导致无效的 XML 文档

标签 c# xml serialization

我正在将对象的 XML 序列化文件写入由 validator.MatchPossouslyValid(string input) 方法生成的文件。第一次调用,序列化并写入文件。但是,第二次调用失败并出现异常:System.InvalidOperationException:'状态 EndRootElement 中的 token StartElement 将导致无效的 XML 文档。如果要编写 XML 片段,请确保将 ConformanceLevel 设置设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。 '

XmlSerializerNamespaces emptyNS = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var serializer = new XmlSerializer(typeof(PDPCustomerInfoInvalid));
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
//settings.Indent = true;
using (var stream = new System.IO.StreamWriter(args[1], true))
{
    using (var writer = XmlWriter.Create(stream, settings))
        {

                serializer.Serialize(writer, validator.MatchPossiblyValid("STRING FOR PARSING"), emptyNS);
                stream.Write(Environment.NewLine);
                stream.Flush();
                //Line below throws the exception
                serializer.Serialize(writer, validator.MatchPossiblyValid("STRING FOR PARSING"), emptyNS);
                stream.Write(Environment.NewLine);
                stream.Flush();

        }
}

最佳答案

您正在尝试使用单个 XmlWriter 创建包含多个 root elements 的 XML 文件。 。然而,XML 标准要求 exactly one root element每个 XML 文档。您的 XmlWriter 引发异常,表明正在创建的 XML 无效。 (MCVE here 。)

如果您确实需要将两个 XML 文档连接到一个文件中,则可以使用使用 XmlWriterSettings.CloseOutput 创建的单独的 XmlWriters设置为false:

using (var stream = new System.IO.StreamWriter(args[1], true))
{
    var settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    //settings.Indent = true;
    settings.CloseOutput = false;

    using (var writer = XmlWriter.Create(stream, settings))
    {
        serializer.Serialize(writer, validator.MatchPossiblyValid("STRING FOR PARSING"), emptyNS);
    }

    stream.Write(Environment.NewLine);
    stream.Flush();

    using (var writer = XmlWriter.Create(stream, settings))
    {
        serializer.Serialize(writer, validator.MatchPossiblyValid("STRING FOR PARSING"), emptyNS);
    }
    //Line below throws the exception
    stream.Write(Environment.NewLine);
    stream.Flush();             
}

样本fiddle .

或者,更好的是,根本不要这样做,因为如上所述,具有多个根的“XML 文档”是无效的。相反,在某个容器元素内序列化这两个对象。

关于c# - 连续的 XML 序列化原因 - EndRootElement 状态下的 token StartElement 将导致无效的 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44008900/

相关文章:

c# - LINQ,查询的大过滤器

c# - 合适的 ObservableCollection

java - 使用 XMLStreamWriter 更新 XML

django-rest-framework - ForeignKey 不允许空值

c# - Long 来自字符列表 C#

c# - .NET 远程服务看似崩溃,并停止响应客户端

android - XML 代码不工作

java - 将值保存到列表的简单递归函数

json - 错误序列化

C++ Boost 序列化 序列化模板派生类