如何在不覆盖以前数据的情况下将数据添加到 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 为尝试以下:
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");
【讨论】:
">3453453453</NumTel"
- 错字?以上是关于如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)的主要内容,如果未能解决你的问题,请参考以下文章
如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame
如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?
无法在不覆盖的情况下将 R 数据框附加到现有 Excel 中