如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)

Posted

技术标签:

【中文标题】如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)【英文标题】:How to add data to XML file without overwriting previous data (C#) 【发布时间】:2021-05-15 00:55:48 【问题描述】:

此代码保存新数据,它用新数据覆盖旧数据。

private void button4_Click(object sender, EventArgs e)

    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    dt.TableName = "Patient";
    dt.Columns.Add("FIO");
    dt.Columns.Add("NumTel");
           
    ds.Tables.Add(dt);
 
    DataTable dt1 = new DataTable();
    dt1.TableName = "Info";
    dt1.Columns.Add("Ticket");
    dt1.Columns.Add("Doc");
    dt1.Columns.Add("Spec");
    dt1.Columns.Add("Data");
    dt1.Columns.Add("Time");
    ds.Tables.Add(dt1);
 
    DataRow row = ds.Tables["Patient"].NewRow();
    row["FIO"] = textBox1.Text;
    row["NumTel"] = textBox2.Text;
            
    ds.Tables["Patient"].Rows.Add(row);
 
    foreach (DataGridViewRow r in dataGridView1.Rows)
    
        DataRow row1 = ds.Tables["Info"].NewRow();
        row1["Ticket"] = r.Cells[0].Value;
        row1["Data"] = r.Cells[1].Value;
        row1["Time"] = r.Cells[2].Value;
        row1["Doc"] = r.Cells[3].Value;
        row1["Spec"] = r.Cells[4].Value;
        ds.Tables["Info"].Rows.Add(row1);
    
    ds.WriteXml(@"C:\Users\Vano\Desktop\XMLSaving - Copy\files\Data.xml");

在 XML 中它看起来像这样:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Patient>
    <FIO>Оля Эрцык Канаева</FIO>
    <NumTel>5678311233</NumTel>
  </Patient>
  <Info>
    <Ticket>489155</Ticket>
    <Doc>МЕЛЬНИК ІВАН ІВАНОВИЧ</Doc>
    <Spec>Стоматолог-ортодонт</Spec>
    <Data>01.02.2021</Data>
    <Час>11:00</Час>
  </Info>
  <Info/>
</NewDataSet>

我想做这个:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Patient>
    <FIO>Оля Эрцык Канаева</FIO>
    <NumTel>5678311233</NumTel>
  </Patient>
  <Info>
    <Ticket>489155</Ticket>
    <Doc>МЕЛЬНИК ІВАН ІВАНОВИЧ</Doc>
    <Spec>Стоматолог-ортодонт</Spec>
    <Data>01.02.2021</Data>
    <Time>11:00</Time>
  </Info>
<Patient>
    <FIO>Иван Ходор Михайлович</FIO>
    <NumTel>3453453453</NumTel>
  </Patient>
  <Info>
    <Ticket>340999</Ticket>
    <Doc>БОЙКО ГАННА ІВАНІВНА</Doc>
    <Spec>Стоматолог-терапевт</Spec>
    <Data>30.01.2021</Data>
    <Time>13:00</Time>
  </Info>
  <Info/>
</NewDataSet>

我认为需要这样做:当我创建 DataSet 时,我需要从现有的 XML 文件创建它,然后在保存旧数据时将保留。 但是我不知道怎么写。 你能帮我改进一下吗? DataSet ds = derictory to xml文件,实在不知道怎么写。

更新 我创造了这个。但是当一个人保存它时,它会将结构连接到 XML 文件。如果另一个人写了一些东西,添加它并保存它会覆盖并且以前的数据会消失。

    我填写了所有文本框并按下了“添加到列”按钮
 private void button1_Click_1(object sender, EventArgs e)
        
                   
          
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = textBox5.Text;
                dataGridView1.Rows[n].Cells[1].Value = textBox3.Text;
                dataGridView1.Rows[n].Cells[2].Value = textBox4.Text;
                dataGridView1.Rows[n].Cells[3].Value = textBox6.Text;
                dataGridView1.Rows[n].Cells[4].Value = textBox7.Text;
                textBox8.Text = "Бот: Ви додали свій запис!";
            
        
[1]: https://i.stack.imgur.com/1Q58D.png

然后我保存它:

        
           
                DataSet ds = new DataSet ();
                
                DataTable dt = new DataTable();


                dt.TableName = "Пацієнт";
                dt.Columns.Add("ПІБ");
                dt.Columns.Add("НомТел");

                ds.Tables.Add(dt);

                DataTable dt1 = new DataTable();
                dt1.TableName = "Інформація";
                dt1.Columns.Add("Квиток");
                dt1.Columns.Add("Лікар");
                dt1.Columns.Add("Спеціальність");
                dt1.Columns.Add("Дата");
                dt1.Columns.Add("Час");
                ds.Tables.Add(dt1);

                DataRow row = ds.Tables["Пацієнт"].NewRow();
                row["ПІБ"] = textBox1.Text;
                row["НомТел"] = textBox2.Text;
                ds.Tables["Пацієнт"].Rows.Add(row);

                foreach (DataGridViewRow r in dataGridView1.Rows)
                
                    DataRow row1 = ds.Tables["Інформація"].NewRow();
                    row1["Квиток"] = r.Cells[0].Value;
                    row1["Дата"] = r.Cells[1].Value;
                    row1["Час"] = r.Cells[2].Value;
                    row1["Лікар"] = r.Cells[3].Value;
                    row1["Спеціальність"] = r.Cells[4].Value;
                    ds.Tables["Інформація"].Rows.Add(row1);
                               ds.WriteXml(@"C:\Users\VanoPC\Desktop\XMLSavingCopy\files\Data.xml"); 
               

XML:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Пацієнт>
    <ПІБ>bla bal</ПІБ>
    <НомТел>1123213453</НомТел>
  </Пацієнт>
  <Інформація>
    <Квиток>897292</Квиток>
    <Лікар>МЕЛЬНИК ІВАН ІВАНОВИЧ</Лікар>
    <Спеціальність>Стоматолог-терапевт</Спеціальність>
    <Дата>30.01.2021</Дата>
    <Час>11:00</Час>
  </Інформація>
  <Інформація>
    <Квиток>897292</Квиток>
    <Лікар>ШТЕПА ІВАН АНДРІЙОВИЧ</Лікар>
    <Спеціальність>Стоматолог-ортопед</Спеціальність>
    <Дата>30.01.2021</Дата>
    <Час>15:00</Час>
  </Інформація>
  <Інформація />
</NewDataSet>

是的。来自未知单词的 XML 标题,但它不会改变含义。 我不明白如何为新人添加新数据,因为它会覆盖以前谁是第一个。 如果新人来填写文本框并保存数据,它会删除有关另一个人的先前数据。我希望这些信息就足够了。也许我应该在 add 方法中改变一些东西?

【问题讨论】:

我实际上建议放弃使用 xml 文件。只是不要。今天,您可以轻松地学习和使用像 SQLite 这样的单文件数据库,至少在我的书中,与处理 XML 相比,它方式“对初学者友好”。当然,如果您没有强制使用 XML 或 XML 处理是您想要学习的东西。 @Fildor 这是我学校作业的最后一部分,我被告知要这样做。 )) 好的,所以你被 XML 卡住了。我只是想提请您注意这种可能性。 所以,类似于WriteXML,有ReadXML。请注意,您现在必须有两条路径: 1. 没有可依据的数据。 => 从头开始​​创建新的数据集并保存。 2.有一个数据文件=>从文件中加载数据集并添加到它。然后保存结果。 请注意,您通常会将 UI 与所有这些分开。文件 I/O 很昂贵,并且随着数据文件的增长,这可能会在相当长的一段时间内“冻结”您的 UI。而是一步一个脚印。只是一个“提醒”。 【参考方案1】:

您可以使用 AppendChild 方法来做到这一点。

看这个例子:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" +
            "<title>Pride And Prejudice</title>" +
            "</book>");

XmlNode root = doc.DocumentElement;

//Create a new node.
XmlElement elem = doc.CreateElement("price");
elem.InnerText="19.95";

//Add the node to the document.
root.AppendChild(elem);

Console.WriteLine("Display the modified XML...");
doc.Save(Console.Out);

这有帮助吗?

【讨论】:

老实说不是,客户在文本框中写了关于他自己的信息。我让 ai 为 制作了一堆文本框,并将其覆盖在框 中,与第二部分相同.我创建了一个用于将某些数据添加到列的函数,它可以在 Forms.When 中看到。如果我想保存,它会使用来自文本框的数据创建用于 XML 的列。【参考方案2】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication181

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            DataSet ds = new DataSet();
            ds.ReadXml(FILENAME);

            DataTable dt = ds.Tables["Patient"];

            dt.Rows.Add(new object[] "Иван Ходор Михайлович", "3453453453");

            dt = ds.Tables["Info"];

            dt.Rows.Add(new object[]  "340999", "БОЙКО ГАННА ІВАНІВНА","Стоматолог-терапевт", "30.01.2021", "13:00");

        
    

【讨论】:

"&gt;3453453453&lt;/NumTel" - 错字?

以上是关于如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame

如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?

无法在不覆盖的情况下将 R 数据框附加到现有 Excel 中

如何在不覆盖数据源参数的情况下将附加参数传递给剑道模板

有没有办法在不覆盖现有类名的情况下将类名添加到 blazor 组件?

如何在不触发 selectionchanged 事件的情况下将项目添加到 ExtJS GridPanel