[英]How to convert DataSet to XML and back to DataSet
我編寫了下面的代碼以從 DataSet 生成 XML 然后返回到相同的 DataSet。 但我得到的數據集總是空的。
測試方法是這樣的——
[Test]
public void XmlToDataSetTest()
{
var dataSetExpected = GenerateDataSet();
var xmlString = GetXml(dataSetExpected);
var dataSetActual = GetDataSet(xmlString); //dataSetActual is always empty, no DataTables inside
//Assert
}
private DataSet GenerateDataSet()
{
var dataSet = new DataSet("DataSetSample");
for (int dt = 0; dt < 2; dt++)
{
var dataTable = new DataTable($"Table{dt}");
for (int c = 0; c < 2; c++)
{
dataTable.Columns.Add(new DataColumn($"Column{c}"));
}
for (int c = 0; c < 2; c++)
{
var workRow = dataTable.NewRow();
for (int r = 0; r < 2; r++)
{
workRow[r] = $"Column{c} - Row{r}";
}
dataTable.Rows.Add(workRow);
}
dataSet.Tables.Add(dataTable);
}
return dataSet;
}
public DataSet GetDataSet(string xml)
{
var dataSet = new DataSet();
var xmlSR = new StringReader(xml);
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
return dataSet;
}
public string GetXml(DataSet dataSet)
{
return dataSet.GetXml();
}
我的期望是dataSetActual
應該與dataSetExpected
完全相同。 但由於某種原因, dataSetActual
始終為空。 我知道這不應該那么棘手。 我可能缺少一些非常微不足道的東西。
誰能幫我解決這個問題?
編輯:
我根據@jgw 的建議修改了GetDataSet
以使用WriteXml
,但仍然是同樣的問題。 dataSetActual
在測試方法中仍然是空白 -
public DataSet GetDataSet(string xml)
{
var dataSet = new DataSet();
var xmlStringWriter = new StringWriter(new StringBuilder(xml));
dataSet.WriteXml(xmlStringWriter, XmlWriteMode.WriteSchema);
return dataSet;
}
是的,GetXml function 將返回一個簡單的 xml 字符串,該字符串實際上並不打算放回 DataSet。 可以從現有的 XML 推斷出架構,但實際上有一種更簡單的方法。
改用 WriteXml 方法,您可以使用 WriteXmlMode 來查看您是否只需要數據、架構或兩者。
請參閱https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset.writexml?view=netcore-3.1中的備注
當然,請記住,“WriteXml”正在獲取數據集並創建 XML,“ReadXml”正在將 xml stream 轉換回數據集。 您可以根據自己的情況使用 XmlWriteMode 和 XmlReadMode 來保留架構。 這是一些工作代碼:
public string GetXml(DataSet dataSet)
{
using (MemoryStream memStream = new MemoryStream())
{
dataSet.WriteXml(memStream);
return Encoding.ASCII.GetString(memStream.ToArray());
}
}
public DataSet ToDataSet(string xml)
{
var byteData = Encoding.ASCII.GetBytes(xml);
using (MemoryStream memStream = new MemoryStream(byteData))
{
DataSet ds = new DataSet();
ds.ReadXml(memStream);
return ds;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.