using System.Collections.Generic;
using System.Xml.Serialization;
public static partial class XmlExtensions
static Encoding Utf8EncodingNoBom { get; } = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
public static void SerializeFragmentsToXml<T>(this IEnumerable<T> enumerable, Stream stream, XmlSerializer? serializer = null, XmlSerializerNamespaces? ns = null)
var newLineBytes = Utf8EncodingNoBom.GetBytes(newLine+newLine);
var settings = new XmlWriterSettings()
NamespaceHandling = NamespaceHandling.Default,
Encoding = Utf8EncodingNoBom,
NewLineHandling = NewLineHandling.Replace,
OmitXmlDeclaration = true,
WriteEndDocumentOnClose = false,
NewLineOnAttributes = false,
serializer ??= new XmlSerializer(typeof(T));
ns ??= new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
foreach (var item in enumerable)
stream.Write(newLineBytes);
using (var xmlWriter = XmlWriter.Create(stream, settings))
serializer.Serialize(xmlWriter, item, ns);
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "flyingMonkey", Namespace = null)]
public class FlyingMonkey
[System.Xml.Serialization.XmlAttributeAttribute()]
public static FlyingMonkey Create(string? name = null) =>
new Limb() { name = "leg" }, new Limb() { name = "arm" },
new Limb() { name = "tail" }, new Limb() { name = "wing" },
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "limb", Namespace=null)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public static void Test()
var items = new [] { "Koko", "POCO", "Loco" }.Select(n => FlyingMonkey.Create(n));
using var stream = new MemoryStream();
var serializer = new XmlSerializer(typeof(FlyingMonkey), defaultNamespace: null);
items.SerializeFragmentsToXml(stream, serializer : serializer);
var xml = Encoding.UTF8.GetString(stream.GetBuffer().AsSpan(0, (int)stream.Length));
public static void Main()
Console.WriteLine("Environment version: {0} ({1}, {2}, NewLine: {3}).",
System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion,
System.Text.Json.JsonSerializer.Serialize(Environment.NewLine));
Console.WriteLine("Failed with unhandled exception: ");