The DataSet
object in .NET has a GetXml
function. The method takes data from all the tables and from all rows and creates XML. The problem is that you cannot change this XML. So I created a method that does something similar:
private string GetXmlFromDataset(DataSet dataSet, bool isStatefull) {
XmlTextWriter xwriter = null;
try
{
xwriter = new XmlTextWriter(new MemoryStream(), Encoding.UTF8);
xwriter.WriteStartElement("NewDataSet");
foreach (DataTable dt in dataSet .Tables )
{
int rowNum = 0;
DateTime tmp = DateTime.MinValue;
if (isStatefull)
dt.Columns.Add(new DataColumn("IsDummy", typeof(bool)));
if (isStatefull && dt.Rows.Count == 0)
{
dt.Rows.Add(dt.NewRow());
dt.Rows[0]["IsDummy"] = true;
}
foreach (DataRow dr in dt.Rows)
{
xwriter.WriteStartElement(dt.TableName);
if (isStatefull)
{
xwriter.WriteAttributeString("stat", "0");
xwriter.WriteAttributeString("rowNum", rowNum.ToString());
}
DateTime tmpDate = DateTime.MinValue ;
foreach (DataColumn dc in dr.Table.Columns)
{
string colValue = String.Empty;
switch (dc.DataType.Name)
{
case "DateTime":
if (DateTime.TryParse(dr[dc,
DataRowVersion.Current].ToString(),
out tmpDate))
colValue = tmpDate.ToString("yyyy-MM-ddTHH:mm:ss");
else
colValue = dr[dc, DataRowVersion.Current].ToString();
break;
default:
colValue = dr[dc, DataRowVersion.Current].ToString();
break;
}
xwriter.WriteStartElement(dc.ColumnName.Replace(" ","_x0020_"));
if ( isStatefull || String.Compare(
dc.DataType.Name, "string", true) != 0)
{
xwriter.WriteAttributeString("datatype", dc.DataType.Name);
}
if (isStatefull)
{
xwriter.WriteAttributeString("stat", "0");
}
xwriter.WriteString(colValue);
xwriter.WriteEndElement();
}
xwriter.WriteEndElement();
rowNum++;
}
}
xwriter.WriteEndElement();
xwriter.Flush();
xwriter.BaseStream.Seek(0, SeekOrigin.Begin);
StreamReader reader = new StreamReader(xwriter.BaseStream);
return reader.ReadToEnd();
}
finally
{
if (xwriter != null)
{
xwriter.Close();
xwriter = null;
}
}
}
You can read about in my blog: http://gregnozik.blogspot.com/2011/09/getxml-dataset-method-not-good-enough.html.