【问题标题】:How to convert DataSet to XML and back to DataSet如何将 DataSet 转换为 XML 并返回 DataSet
【发布时间】:2020-10-15 00:56:57
【问题描述】:

我编写了下面的代码来从 DataSet 生成 XML,然后返回到相同的 DataSet。但我生成的 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;
        }

【问题讨论】:

    标签: c# .net xml dataset


    【解决方案1】:

    是的,GetXml 函数将返回一个简单的 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 流转换回数据集。您可以根据自己的情况使用 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;
        }
    }
    

    【讨论】:

    • 看起来很奇怪,它只是默默地失败并导致一个空的DataSet,因为你可以写(new DataSet()).ReadXml(new StringReader("&lt;foo&gt;&lt;/foo&gt;"));并且什么都没有发生,一点也不例外
    • @kgw - 我将代码更改为使用 WriteXML 方法,但我仍然遇到同样的问题。请查看编辑。您介意提供一个示例代码来说明如何做到这一点吗?
    • @user979189 如果这对您有用并且对您有所帮助,如果您能将答案归功于我,那将对我非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多