Til inspiration:
using System;
using System.IO;
using System.Text;
using System.Xml;
namespace E
{
public class LoggingStreamReader : StreamReader
{
private TextWriter log;
public LoggingStreamReader(Stream stm, TextWriter log) : base(stm)
{
this.log = log;
}
public override int Read()
{
int c = base.Read();
log.Write((char)c);
return c;
}
public override string ReadLine()
{
string line = base.ReadLine();
log.WriteLine(line);
return line;
}
public override int Read(char[] buffer, int index, int count)
{
int n = base.Read(buffer, index, count);
String s = new String(buffer, index, n);
log.Write(s);
return n;
}
// more methods may need to be overriden
}
public class LoggingStreamWriter : StreamWriter
{
private TextWriter log;
public LoggingStreamWriter(Stream stm, TextWriter log) : base(stm)
{
this.log = log;
}
public override void Write(char c)
{
log.Write(c);
base.Write(c);
}
public override void WriteLine(string line)
{
log.WriteLine(line);
base.WriteLine(line);
}
public override void Write(char[] buffer)
{
log.Write(buffer);
base.Write(buffer);
}
public override void Write(char[] buffer, int index, int count)
{
log.Write(buffer, index, count);
base.Write(buffer, index, count);
}
public override void Write(string format, params object[] arg)
{
log.Write(format, arg);
base.Write(format, arg);
}
public override void WriteLine(string format, params object[] arg)
{
log.WriteLine(format, arg);
base.WriteLine(format, arg);
}
// more methods may need to be overriden
}
public class Program
{
public static void TestRead(Stream stm)
{
using(StreamReader sr = new StreamReader(stm))
{
using(XmlReader xr = XmlTextReader.Create(sr))
{
while(xr.Read())
{
Console.WriteLine("{0} {1} {2}", xr.NodeType, xr.Name, xr.Value);
}
}
}
}
public static void TestLoggingRead(Stream stm)
{
using(StreamReader sr = new LoggingStreamReader(stm, Console.Out))
{
using(XmlReader xr = XmlTextReader.Create(sr))
{
while(xr.Read())
{
Console.WriteLine("{0} {1} {2}", xr.NodeType, xr.Name, xr.Value);
}
}
}
}
public static void TestRead(string xmlstr)
{
TestRead(new MemoryStream(Encoding.UTF8.GetBytes(xmlstr)));
TestLoggingRead(new MemoryStream(Encoding.UTF8.GetBytes(xmlstr)));
}
public static void TestWrite(Stream stm)
{
using(StreamWriter sw = new StreamWriter(stm))
{
using(XmlWriter xw = XmlTextWriter.Create(sw))
{
xw.WriteStartDocument();
xw.WriteStartElement("test");
xw.WriteString("bla bla");
xw.WriteEndElement();
xw.WriteEndDocument();
}
}
}
public static void TestLoggingWrite(Stream stm)
{
using(StreamWriter sw = new LoggingStreamWriter(stm, Console.Out))
{
using(XmlWriter xw = XmlTextWriter.Create(sw))
{
xw.WriteStartDocument();
xw.WriteStartElement("test");
xw.WriteString("bla bla");
xw.WriteEndElement();
xw.WriteEndDocument();
}
}
}
public static void TestWrite()
{
MemoryStream ms;
ms = new MemoryStream();
TestWrite(ms);
Console.WriteLine(Encoding.UTF8.GetString(ms.GetBuffer()));
ms = new MemoryStream();
TestLoggingWrite(ms);
Console.WriteLine(Encoding.UTF8.GetString(ms.GetBuffer()));
}
public static void Main(string[] args)
{
TestRead("<all><elm>1</elm><elm>2</elm><elm>3</elm></all>");
TestWrite();
Console.ReadKey();
}
}
}