WriteXML,带表名的ReadXML问题

时间:2017-12-28 00:08:04

标签: c# datatable readxml writexml

我有一个程序,我在其中运行查询并将数据存储在DataTable中。然后我允许用户保存该DataTable.WriteXML。我遇到的问题是我想将保存的文件(XML文件)读入另一个具有不同名称的DataTable中 - 并且它不允许它!它给我一个错误“将结果表加载到文件时出错:数据表:'ImportTable'与源中的任何DataTable不匹配”

现在我相信这条消息告诉我XML包含的表名与我尝试将ReadXML插入其中的DataTable不同。我已经尝试将TableName属性设置为空白 - 但这没有任何区别。

所以 - 我的问题是其他人如何解决这个问题?我使用标准的DataTable.WriteXML(filename) - 和DataTable.ReadXML方法调用。由于一些设计问题 - 我需要使用与导出数据的导入DataTable不同的导入DataTable。

有没有不同的方法可以写出和读入DataTable中的数据来解决这个问题?

示例代码 - 显示问题 在表单加载中 - 创建两个表 - 一个名为Export the other Import。为Export创建一个结构 - 并用10条记录填充它。

    private void Form_Main_Load(object sender, EventArgs e)
    {
        ExportTable = new DataTable("Export");
        ImportTable = new DataTable("Import");

        ExportTable.Columns.Add("ID", Type.GetType("System.Int32"));
        ExportTable.Columns.Add("Name", Type.GetType("System.String"));
        ExportTable.Columns.Add("Amount", Type.GetType("System.Int32"));

        // Populate the first one
        DataRow workRow;
        for (int i = 0; i <= 9; i++)
        {
            workRow = ExportTable.NewRow();
            workRow[0] = i;
            workRow[1] = "CustName" + i.ToString();
            workRow[2] = i;
            ExportTable.Rows.Add(workRow);
        }
    }

然后创建两个按钮 - 一个用于导出数据 - 另一个用于导入数据。

    private void button_Export_Click(object sender, EventArgs e)
    {
        ExportTable.WriteXml("c:\\Temp\\TableOut.xml");
    }

    private void button_Import_Click(object sender, EventArgs e)
    {
        ImportTable.ReadXmlSchema("c:\\Temp\\TableOut.xml");
        ImportTable.ReadXml("c:\\Temp\\TableOut.xml");
    }

运行程序 - 导出数据 - 然后单击“导入”按钮。当你这样做 - 你会得到错误 - “DataTable'Import'与源中的任何DataTable都不匹配。” 现在 - 我意识到这是因为XML具有嵌入在XML中的Export表名。在我的情况下,我需要将这些数据导入到具有不同名称的DataTable中 - 我想知道其他人在过去如何(以及如果)处理过这个问题?您是否手动更改了XML中的名称?您是否暂时更改了数据表名称?或者是否有另一种更好的方法来解决这个尝试使用DataTable的READXML方法的问题?

1 个答案:

答案 0 :(得分:0)

好的 - 我一直在玩这个 - 并有一个解决方案。不确定它是最好的(我会感谢任何关于我如何做得更好的评论。)

基本上我要做的就是将XML写入字符串阅读器 - 更改架构和记录元素的表名。两者都是&lt;&gt;和标签 然后,当我读入它时 - 我不得不反过来 - 基本上将文件读成字符串 - 然后将所有表名更改回我需要它们。然后我必须将文件写入磁盘(临时文件) - 然后使用ReadXML方法读取该临时文件,然后删除该文件。 我不确定为什么带有字符串阅读器的ReadXML不起作用(它似乎是一个有效的参数) - 但是我发现了一些帖子说明了READXML方法和字符串阅读器存在问题 - 所以我只是把它写出来使用文件名来存档和使用READXML - 它工作正常。

我希望这有助于其他人 - 即使它不是'最佳'解决方案 - 也许其他人可以改进它。

写XML

// Write XML
StringWriter sw = new StringWriter();
ResultDT.WriteXml(sw, XmlWriteMode.WriteSchema);
string OutputXML = sw.ToString();
// now replace the Table Name
OutputXML = OutputXML.Replace("<" + ResultDT.TableName + ">", "<" + "ExportTable" + ">");
OutputXML = OutputXML.Replace("</" + ResultDT.TableName + ">", "</" + "ExportTable" + ">");
OutputXML = OutputXML.Replace("MainDataTable=\"" + ResultDT.TableName + "\"", "MainDataTable=\"" + "ExportTable" + "\"");
OutputXML = OutputXML.Replace("name=\"" + ResultDT.TableName + "\"", "name=\"" + "ExportTable" + "\"");
System.IO.File.WriteAllText(fileName, OutputXML);

阅读XML

// Read XML
InputXML = System.IO.File.ReadAllText(fileName);
// now replace the Table Name
InputXML = InputXML.Replace("<" + "ExportTable" + ">", "<" + ResultTable.TableName + ">");
InputXML = InputXML.Replace("</" + "ExportTable" + ">", "</" + ResultTable.TableName + ">");
InputXML = InputXML.Replace("MainDataTable=\"" + "ExportTable" + "\"", "MainDataTable=\"" + ResultTable.TableName + "\"");
InputXML = InputXML.Replace("name=\"" + "ExportTable" + "\"", "name=\"" + ResultTable.TableName + "\"");
string TempFileName = "TempDumpFile.idt";
System.IO.File.WriteAllText(TempFileName, InputXML);
ResultTable.ReadXmlSchema(TempFileName);
ResultTable.ReadXml(TempFileName);
System.IO.File.Delete(TempFileName);
相关问题