You need a writer, not reader, to write from DataSet to XDocument:
XDocument xd = new XDocument();
using (var writer = xd.CreateWriter())
{
ds.WriteXml(writer, XmlWriteMode.WriteSchema); // XmlWriteMode.DiffGram
}
Question
How do I obtain the Diffgram of a DataSet in an XElement? (Or XDocument)
I found out how to obtain the Diffgram in a string:
// DataSet to Diffgram in a string:
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8 };
using (XmlWriter xw = XmlWriter.Create(sb, settings))
{
ds.WriteXml(xw, XmlWriteMode.WriteSchema);//XmlWriteMode.DiffGram
}
string str = sb.ToString();
but it seems wasteful to first output the xml of a diffgram to a string and then parse it back in to an XElement. So I am trying to find out how to fill in the missing link in this code, which should transfer the xml of the diffgram without conversions to an Xml variable:
// I have a DataSet filled with some data
DataSet ds = new DataSet();
ds.Tables.Add(ScanData);
// I need the diffgram of the DataSet in an XElement
XElement xe = null;
XmlReader xr = xe.CreateReader();
// I could live with output to XDocument, and extract the XElement later
XDocument xd = new XDocument();
XmlReader xrd = xd.CreateReader();
// Q: How do I construct a stream that connects an XmlReader to ds.WriteXml()?
Stream stream = ...???... ;
// This method creates the DiffGram output format to a stream
ds.WriteXml(stream, XmlWriteMode.WriteSchema);//diffgram output
I hope to find the answer to my code problem, and maybe even to learn how stream/reader/writer really work.
Solution
You need a writer, not reader, to write from DataSet to XDocument:
XDocument xd = new XDocument();
using (var writer = xd.CreateWriter())
{
ds.WriteXml(writer, XmlWriteMode.WriteSchema); // XmlWriteMode.DiffGram
}