簡體   English   中英

如何將 DataSet 轉換為 XML 並返回 DataSet

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM