【问题标题】:How to save .xml file without overwriting the file and the table? c#如何在不覆盖文件和表格的情况下保存 .xml 文件? C#
【发布时间】:2021-08-19 08:01:50
【问题描述】:

我有一个用于编辑 .xml 文件的程序。 我可以编辑和保存.xml文件,写入文件可以正常工作,但是当我编辑和保存另一个XML表时,它会覆盖前一个。 p>

我的代码:

            DataTable ds = (DataTable)dataGridView1.DataSource;
            ds.WriteXml(openFileDialog1.FileName);
            saved = true;
            MessageBox.Show("Successfully saved!", "Saving.");

我知道为什么会这样,程序在保存时正在保存 dataGridView 中的内容。

我试过:ds.Merge()TextWriters各种类型的StreamsFileModes

那么如何在不完全覆盖的情况下保存 xml 文件呢?

例子:

这是我拥有的文件:

    <catalog>
       <book id="bk101">
          <author>Gambardella, Matthew</author>
          <title>XML Developer's Guide</title>
          <genre>Computer</genre>
          <price>44.95</price>
          <publish_date>2000-10-01</publish_date>
          <description>An in-depth look at creating applications 
          with XML.</description>
       </book>
<catalog>

但是当我使用另一个 XML 表编辑文件时,它会被覆盖,它看起来像这样:

<catalog>
  <plant>
    <name>tulip</name>
  </plant>
</catalog>

感谢您的帮助!

抱歉,语言不好。

【问题讨论】:

  • 保存就是覆盖。如果要更改文件,首先必须读取它,然后更改它,然后保存整个文件。你不能保存文件的一部分,这没有意义
  • 这能回答你的问题吗? Modify XML existing content in C#
  • 你不能保存文件的一部分 - 好吧,你可以..但不能用WriteXml

标签: c# xml


【解决方案1】:

那么如何在不完全覆盖的情况下保存 xml 文件呢?

这就是 WriteXml 所做的。如果您想加载一个包含一本书的 XML 文件(加载到一个带有 books 表的数据集?)并在其中保存一本书和一株植物,那么您保存的数据集将必须代表合并的更改(它将具有有一个书桌和一个植物桌)

我对您的问题感到困惑的是“程序正在保存 datagridview 中的内容” - datagridview 不显示数据集,它是数据表的集合 - 它显示单个数据表。您的 DGV 不能同时展示一本书和一株植物。因此,您应该绝对确定数据集包含一本书和一株植物,即使您只能看到其中一个

让我们将您的图书 XML 带到那里,修复结束标签,然后加载它:

此时只有书桌

再执行 3 行代码,我添加了另一个表、列和行值,并且集合中还有另一个数据表:

在可视化工具中选择它会更改 DGV 以显示郁金香:

现在 WriteXml 将写入一个合并文件:

【讨论】:

  • 嗯:是的,我想要一个。 XML 文件,例如。一个“植物”和一个“书”表,但我找不到合并这两个表的方法。
  • 你不合并表格;一本书不是植物。您的数据集需要多个表,一张用于书籍,一张用于植物。请参阅我的编辑。笔记;如果您从一个 xml 文件中读取植物并从另一个文件中读取书籍,则需要将表从一个数据集移植到另一个数据集(例如 bookDS.Tables.Add(some_datatable)),但如果数据表已经在另一个数据集中,则它必须是先删除;一个表一次只能在一个 ds 中
  • 是的,我需要另一个表,这正是我想要的,你的代码看起来正是我想要的,有时间我会试试的!谢谢,非常感谢!
  • 你能告诉我你是如何解析这本书的XML的代码吗?从图片上看,我不是很明白。
  • 就是ds.ReadXml("c:\temp\a.xml")这一行——我从你的问题中取出了xml并将其保存在该路径中的文件中——catalog成为数据集,book成为表格, book 中的节点成为列名称/值/类型。这不是 C# 但那是 jsut 因为我当时打开了一个 VB 项目 - 它们是相同的语言,只要记住 VB 使用 () 进行数组访问,而 c# 使用 [] 所以例如ds.Tables["plant"].Rows.Add("tulip")...。如果您从未注意到,在现代 VS 中,方法是黄色的,属性是白色的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
相关资源
最近更新 更多