首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WriteXML,ReadXML问题与表名

WriteXML,ReadXML问题与表名
EN

Stack Overflow用户
提问于 2017-12-28 00:08:04
回答 1查看 1K关注 0票数 0

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

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

所以-我的问题是其他人是如何绕过这个问题的?我使用的是标准的DataTable.WriteXML(文件名)和DataTable.ReadXML方法调用。而且,由于一些设计问题,我确实需要让导入DataTable的命名与用于导出数据的命名不同。

是否有不同的方式来写出和读取DataTable中的数据,从而解决这个问题?

示例代码-显示表单load中的问题-创建两个表-一个名为。为导出创建一个结构--并用10条记录填充它。

代码语言:javascript
复制
    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);
        }
    }

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

代码语言:javascript
复制
    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");
    }

运行程序-导出数据-然后单击Import按钮。这样做--您将得到错误-- "DataTable‘导入’与源中的任何DataTable不匹配。“现在-我意识到这是因为XML中嵌入了导出表名。在我的例子中,我需要将这些数据导入到一个具有不同名称的DataTable中--我想知道在过去,其他人是如何处理这个问题的?您是否手动更改了XML中的名称?您暂时更改了datatable名称吗?或者,还有其他更好的方法来解决这个尝试使用DataTable的READXML方法的问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-02 07:20:06

好吧-我一直在玩这个-我有个解决办法。不确定这是最好的(我希望你能对我如何做得更好发表意见)。

基本上,我要做的是将XML写入字符串阅读器--更改模式和记录元素的表名。<>和标记都是。

然后,当我读取它时--我必须做相反的操作--基本上将文件读成一个字符串--然后将所有的表名更改回我需要它们的位置。然后,我必须将文件写入磁盘(临时文件),然后使用ReadXML方法读取该临时文件,然后删除该文件。我不知道为什么带有字符串读取器的ReadXML不能工作(它似乎是一个有效的参数)--但我找到了几篇文章,其中指出了READXML方法和字符串读取器存在的问题--所以我简单地将它写成文件并使用带有文件名的READXML --而且它工作得很好。

我希望这对其他人有所帮助--即使这不是“最好的”解决方案--也许其他人可以在这方面有所改进。

编写XML

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48000045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档