名称为 Table 的 WriteXML、ReadXML 问题

WriteXML, ReadXML Issue with Table Name

我有一个程序,其中我 运行 查询并将数据存储在 DataTable 中。然后我允许用户保存那个 DataTable.WriteXML。我遇到的问题是我想将该保存的文件(XML 文件)读入另一个具有不同名称的 DataTable - 但它不允许这样做!它给我一个错误 "Error while loading Results Table to File: Data Table: 'ImportTable' does not match to any DataTable in Source"

现在我相信这条消息告诉我 XML 包含一个与我试图读入 XML 的 DataTable 不同的 table 名称。我尝试将 TableName 属性 设置为空白 - 但这没有任何区别。

所以 - 我的问题是其他人如何解决这个问题?我正在使用标准的 DataTable.WriteXML(filename) - 和 DataTable.ReadXML 方法调用。并且由于一些设计问题 - 我确实需要将导入数据表命名为不同于用于导出数据的名称。

是否有其他方法可以解决此问题来写入和读取 DataTable 中的数据?

示例代码 - 显示问题 在表单加载中创建两个 tables - 一个名为 Export 另一个 Import。为导出创建一个结构 - 并用 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' does not match to any DataTable in source." 现在 - 我意识到这是因为 XML 在 XML 中嵌入了 Export table 名称。在我的例子中,我需要将该数据导入到具有不同名称的数据表中——我想知道其他人过去是如何(以及是否)处理过这个问题的?您是否手动更改了 XML 中的名称?是不是临时改了datatable的名字?或者是否有另一种更好的方法来解决这个尝试使用 DataTable 的 READXML 方法的问题?

好的 - 我一直在研究这个问题 - 并且找到了解决方案。不确定它是否是最好的(如果有任何关于我如何做得更好的评论,我将不胜感激)。

基本上我必须做的是将 XML 写入字符串 reader - 更改架构和记录元素的 table 名称。 <> 和标签。
然后,当我读入它时——我不得不做相反的事情——基本上是将文件读入一个字符串——然后将所有 table 名称改回我需要的名称。然后我不得不将文件写出到磁盘(临时文件)——然后使用 ReadXML 方法读取该临时文件,然后删除该文件。 我不确定为什么带有字符串 reader 的 ReadXML 不起作用(它似乎是一个有效参数)——但我发现一些帖子指出 READ[= 存在问题28=] 方法和字符串 readers - 所以我只是将它写到文件中并使用 READXML 和文件名 - 它工作正常。

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

写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);