using System.Collections.Generic;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
public static class XmlReaderExtensions
public static IEnumerable<XmlReader> ReadRoots(this XmlReader reader)
if (reader.NodeType == XmlNodeType.Element)
using (var subReader = reader.ReadSubtree())
public static void SplitDocumentFragments(Stream stream, Func<int, string> makeFileName, Action<string, IXmlLineInfo> onFileWriting, Action<string, IXmlLineInfo> onFileWritten)
using (var textReader = new StreamReader(stream, Encoding.UTF8, true, 4096, true))
SplitDocumentFragments(textReader, makeFileName, onFileWriting, onFileWritten);
public static void SplitDocumentFragments(TextReader textReader, Func<int, string> makeFileName, Action<string, IXmlLineInfo> onFileWriting, Action<string, IXmlLineInfo> onFileWritten)
if (textReader == null || makeFileName == null)
throw new ArgumentNullException();
var settings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment, CloseInput = false };
using (var xmlReader = XmlReader.Create(textReader, settings))
var lineInfo = xmlReader as IXmlLineInfo;
foreach (var reader in xmlReader.ReadRoots())
var outputName = makeFileName(index);
if (onFileWriting != null)
onFileWriting(outputName, lineInfo);
using(var writer = XmlWriter.Create(outputName))
writer.WriteNode(reader, true);
if (onFileWritten != null)
onFileWritten(outputName, lineInfo);
public static void Test()
var fileName = "Question57330246.xml";
File.WriteAllText(fileName, GetXml());
using (var stream = File.OpenRead(fileName))
XmlReaderExtensions.SplitDocumentFragments(stream,
index => Path.Combine(outputPath, index.ToString() + ".xml"),
Console.WriteLine("Writing {0}, starting line info: LineNumber = {1}, LinePosition = {2}...",
name, lineInfo?.LineNumber, lineInfo?.LinePosition);
Console.WriteLine(" Done. Result: ");
Console.WriteLine(File.ReadAllText(name));
var xml = @"<TestNode active=""1"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""2"" lastName=""l"" />
<TestNode active=""3"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""4"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""5"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""6"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""7"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""8"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""9"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""10"" lastName=""l""><Foo /> </TestNode>
<TestNode active=""11"" lastName=""l"" />
<TestNode active=""12"" lastName=""l""><Foo /> </TestNode>
public static void Main()
Console.WriteLine("Roslyn 2.0 Compiler; Environment version: " + Environment.Version);
Console.WriteLine("Uncaught exception: ");