连续的XML序列化原因 – 状态EndRootElement中的Token StartElement将导致无效的XML文档

我正在写入对象的文件XML序列化,由validator.MatchPossiblyValid(string input)方法生成。 首先调用,序列化并写入文件。 但是,第二次调用失败并出现exception: System.InvalidOperationException: 'Token StartElement in state EndRootElement would result in an invalid XML document. Make sure that the ConformanceLevel setting is set to ConformanceLevel.Fragment or ConformanceLevel.Auto if you want to write an XML fragment. ' System.InvalidOperationException: 'Token StartElement in state EndRootElement would result in an invalid XML document. Make sure that the ConformanceLevel setting is set to ConformanceLevel.Fragment or ConformanceLevel.Auto if you want to write an XML fragment. '

 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来创建具有多个根元素的XML文件。 但是,XML标准每个XML文档只需要一个根元素 。 您的XmlWriter抛出exception以指示正在创建的XML无效。 (MCVE 在这里 。)

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

 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(); } 

样品小提琴 。

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