最近在做项目,这几天遇到的问题要用到几个数据转换,特此记录一下。
1.DataTable转换为XML的三种方式
public static string DataTableToXml(this DataTable dt)
{
////第一种 返回的XML字符串比较干净,DataTable行中数据为空的没有写入到XML字符串中
System.IO.TextWriter tw = new System.IO.StringWriter();
dt.WriteXml(tw);
return tw.ToString();
////第二种 同第一种
MemoryStream ms = null;
XmlTextWriter XmlWt = null;
ms = new MemoryStream();
////根据ms实例化XmlWt
XmlWt = new XmlTextWriter(ms, Encoding.Unicode);
////获取ds中的数据
dt.WriteXml(XmlWt);
int count = (int)ms.Length;
byte[] temp = new byte[count];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(temp, 0, count);
////返回Unicode编码的文本
UnicodeEncoding ucode = new UnicodeEncoding();
string returnValue = ucode.GetString(temp).Trim();
return returnValue;
///第三种 返回的XML字符串比较复杂,包括了DataTable中各个Column的定义,以及字段类型,当然还包括DataTable行值,以及其他属性
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
serializer.Serialize(writer, dt);
writer.Close();
return sb.ToString();
}
2.XML字符串转换为DataTable
public static DataSet XMLToDataTable(this string StrData)
{
if (!string.IsNullOrEmpty(StrData))
{
XmlDocument xmlDoc = new XmlDocument();
DataSet ds = new DataSet();
try
{
xmlDoc.LoadXml(StrData);
ds.ReadXml(GetStream(xmlDoc.OuterXml));
return ds;
}
catch (Exception e)
{
throw e;
}
}
else
{
return null;
}
}
其中用到GetStream方法如下
public static StreamReader GetStream(this string xmlStr)
{
byte[] tempByte = Encoding.UTF8.GetBytes(xmlStr);
MemoryStream stream = new MemoryStream(tempByte);
//stream.Position = 0;
StreamReader streamReader = new StreamReader(stream);
return streamReader;
}
上面的方法只是将XMl字符串读入到DataSet中,然后再冲DataSet中查找先前定义过的DataTable即可。
DataTable转换为XML字符串调用即为
DataTable dt= new DataTable("Test");
string XmlData=dt.DataTableToXml();
XML字符串转换为DataTable
string XmlData="此处为XML字符串";
DataTable dt=XmlData.XMLToDataTable().Tables["Test"];
此两个方法暂时都用了自定义扩展方法。
以上。