На данный момент я реализовал обертку TextReader, которая внедряет NewLine.Я включил это здесь, если кто-то найдет это полезным, а также если у кого-то есть более элегантное решение - если так, пожалуйста, прокомментируйте!
Он опирается только на XmlReader, вызывающий метод Read (...)для чтения данных - в противном случае выдается NotImplementedException.
В приведенном выше примере вы будете использовать его следующим образом:
textReader = new NewlineAfterXmlDeclReader(new StringReader(fails));
Это реализация
class NewlineAfterXmlDeclReader : TextReader
{
private const int InitialChunkSize = 80;
private const string SearchText = "?><!" + "DOCTYPE"; //concatenation injected for readability in SO purposes only
private static readonly string ReplaceText = "?>" + Environment.NewLine + "<!" + "DOCTYPE";
private readonly TextReader _wrappedReader;
private TextReader _firstChunkReader;
public NewlineAfterXmlDeclReader(TextReader wrappedReader)
{
_wrappedReader = wrappedReader;
var initialChunk = new char[InitialChunkSize];
var count = _wrappedReader.Read(initialChunk, 0, InitialChunkSize);
var initialChunkString = new String(initialChunk, 0, count);
_firstChunkReader = new StringReader(initialChunkString.Replace(SearchText, ReplaceText));
}
public override int Read(char[] buffer, int index, int count)
{
var firstChunkReadCount = 0;
if (_firstChunkReader != null)
{
firstChunkReadCount = _firstChunkReader.ReadBlock(buffer, index, count);
if (firstChunkReadCount == count) return firstChunkReadCount;
_firstChunkReader = null;
index += firstChunkReadCount;
count -= firstChunkReadCount;
}
return firstChunkReadCount + _wrappedReader.Read(buffer, index, count);
}
public override void Close()
{
_wrappedReader.Close();
}
protected override void Dispose(bool disposing)
{
_wrappedReader.Dispose();
}
public override int Peek() { throw new NotImplementedException(); }
public override int Read() { throw new NotImplementedException(); }
public override string ReadToEnd() { throw new NotImplementedException(); }
public override int ReadBlock(char[] buffer, int index, int count) { throw new NotImplementedException(); }
public override string ReadLine() { throw new NotImplementedException(); }
}