将XML反序列化为C#,以便可以再次编辑和重新序列化值

将XML反序列化为C#,以便可以再次编辑和重新序列化值,c#,xml,winforms,xml-serialization,xml-deserialization,C#,Xml,Winforms,Xml Serialization,Xml Deserialization,我用上一个问题中的一些(很多)帮助组合了一个windows窗体,可以找到,这个窗体从一个文本框中获取两个值,并将它们存储在一个元组中,这个元组存储为字典的值,而字典的键则从第三个文本框中获取。表单能够将字典keyvaluepairs序列化为XML文件,但我很难对XML文件进行反序列化,以便可以编辑和重新序列化keyvaluepairs。我有三个按钮Add Submit和Edit,Add将用户输入的值添加到字典中,Submit序列化字典keyvaluepairs,Edit将反序列化XML文件。我正

我用上一个问题中的一些(很多)帮助组合了一个windows窗体,可以找到,这个窗体从一个文本框中获取两个值,并将它们存储在一个元组中,这个元组存储为字典的值,而字典的键则从第三个文本框中获取。表单能够将字典keyvaluepairs序列化为XML文件,但我很难对XML文件进行反序列化,以便可以编辑和重新序列化keyvaluepairs。我有三个按钮Add Submit和Edit,Add将用户输入的值添加到字典中,Submit序列化字典keyvaluepairs,Edit将反序列化XML文件。我正在使用Microsoft Visual Studio 2010和C#

问题摘要:

  • 如何反序列化XML文件
  • 如何编辑keyvaluepairs(可能使用列表框)
  • 如何重新序列化(不确定是否可以使用当前的序列化代码)
  • 我希望我的编辑按钮通过单击来反序列化XML文件,单击后我希望keyvaluepairs列在我设置的listbox(listbox1)中,如果其中一个keyvaluepairs已被单击,则应将特定的值对插入到三个相应的文本框中,如果用户在其中编辑值“添加”按钮可用于将更新后的值添加回列表框,在列表框中使用“提交”按钮可重新序列化值对

    如果我不清楚或者您需要更好的理解,请让我知道,以便我可以澄清

    我将在下面包含简化的代码,以便更容易理解我想做什么:

        namespace Test1
        {
            public partial class Adding : Form
            {
                Dictionary<string, Tuple<int, int>> d = new Dictionary<string, Tuple<int, int>>();
    
                public Adding()
                {
                    InitializeComponent();
                }
    
                public void btn_Add_Click(object sender, EventArgs e)
                {
                    //Declare values for Tuple and Dictionary
                    int X_Co = Convert.ToInt32(XCoordinate.Text);
                    int Y_Co = Convert.ToInt32(YCoordinate.Text);
                    string B_ID = Convert.ToString(BeaconID.Text);
    
                    //Create new Tuple
                    var t = new Tuple<int, int>(X_Co, Y_Co);
    
                    //Add Beacon ID and X,Y coordinates from the tuple into the dictionary
                    if (!d.ContainsKey(B_ID))
                    {
                        d.Add(B_ID, t);//Make sure keys are unique
                    }
                    else
                    {
                        MessageBox.Show("Key already exists please enter a unique key.");
                    }
                    //Display dictionary values in the listbox
                    listBox1.DataSource = new BindingSource(d, null);
                    listBox1.DisplayMember = "Key,Value";
                    //listBox1.ValueMember = "Key";
                }
    
                public void btn_Submit_Click(object sender, EventArgs e)
                {
                    List<Coordinate> cv = new List<Coordinate>();
                    foreach (KeyValuePair<string, Tuple<int, int>> entry in d)
                    {
                        Coordinate v = new Coordinate();
    
                        v.DateTime = DateTime.Now.ToString("dd/MM/yyyy hh/mm/ss");
                        v.BeaconID = entry.Key;
                        v.XCoordinate = entry.Value.Item1.ToString();
                        v.YCoordinate = entry.Value.Item2.ToString();
                        cv.Add(v);
                    }
                    SaveValues(cv);
                    MessageBox.Show("Coordinates were exported successfully", "Message");
                }
    
                public void btn_Edit_Click(object sender, EventArgs e)
                {
    
                }
    
                public class Coordinate
                {
                    public string DateTime { get; set; }
                    public string BeaconID { get; set; }
                    public string XCoordinate { get; set; }
                    public string YCoordinate { get; set; }
                }
    
                public void SaveValues(List<Coordinate> v)
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(List<Coordinate>), new XmlRootAttribute("Coordinates"));
                    using (TextWriter textWriter = new StreamWriter(@"F:\Vista\Exporting into XML\Test1\Coordinates.xml", true))
                    {
                        serializer.Serialize(textWriter, v);
                    }
                }
            }
        }
    
    namespace Test1
    {
    公共部分类添加:表单
    {
    字典d=新字典();
    公共添加()
    {
    初始化组件();
    }
    公共无效btn\u添加\u单击(对象发送者,事件参数e)
    {
    //为元组和字典声明值
    int X_Co=Convert.ToInt32(XCoordinate.Text);
    int Y_Co=Convert.ToInt32(YCoordinate.Text);
    字符串B_ID=Convert.ToString(BeaconID.Text);
    //创建新元组
    var t=新元组(X_-Co,Y_-Co);
    //将元组中的信标ID和X,Y坐标添加到字典中
    如果(!d.ContainsKey(B_ID))
    {
    d、 Add(B_ID,t);//确保键是唯一的
    }
    其他的
    {
    Show(“密钥已存在,请输入唯一密钥”);
    }
    //在列表框中显示字典值
    listBox1.DataSource=newbindingsource(d,null);
    listBox1.DisplayMember=“键,值”;
    //listBox1.ValueMember=“Key”;
    }
    公共无效btn\u提交\u单击(对象发送者,事件参数e)
    {
    列表cv=新列表();
    foreach(d中的KeyValuePair条目)
    {
    坐标v=新坐标();
    v、 DateTime=DateTime.Now.ToString(“dd/MM/yyyy hh/MM/ss”);
    v、 BeaconID=entry.Key;
    v、 XCoordinate=entry.Value.Item1.ToString();
    v、 YCoordinate=entry.Value.Item2.ToString();
    cv.添加(v);
    }
    保存值(cv);
    Show(“坐标导出成功”,“消息”);
    }
    公共无效btn\u编辑\u单击(对象发送者,事件参数e)
    {
    }
    公共类坐标
    {
    公共字符串日期时间{get;set;}
    公共字符串信标ID{get;set;}
    公共字符串XCoordinate{get;set;}
    公共字符串YCoordinate{get;set;}
    }
    公共void保存值(列表v)
    {
    XmlSerializer serializer=新的XmlSerializer(类型(列表),新的XmlRootAttribute(“坐标”);
    使用(TextWriter TextWriter=new StreamWriter(@“F:\Vista\Exporting to XML\Test1\Coordinates.XML”,true))
    {
    serializer.Serialize(textWriter,v);
    }
    }
    }
    }
    

    感谢您提供的所有帮助。

    您可以在程序开始时读取序列化列表(如果有),然后在程序运行时根据需要更新列表

    如果要再次保存数据,只需重新序列化更新的列表即可

    下面的程序演示。它在开始时读取
    列表
    (如果XML文件不存在,则初始化空列表)

    然后它向列表中添加更多的项,并打印出最后添加项的
    信标ID

    最后,它重新序列化新列表

    如果您运行此程序几次(将文件名更改为适合您环境的文件名后),您将看到列表不断变大

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Xml.Serialization;
    
    namespace Demo
    {
        public class Coordinate
        {
            public string DateTime { get; set; }
            public string BeaconID { get; set; }
            public string XCoordinate { get; set; }
            public string YCoordinate { get; set; }
        }
    
        public static class Program
        {
            public static void Main()
            {
                var date = DateTime.Now.ToString();
    
                string filename = "D:\\TMP\\TEST.XML";
    
                List<Coordinate> coords;
    
                // Deserialize the existing list or create an empty one if none exists yet.
    
                if (File.Exists(filename))
                    coords = DeserializeFromFile<List<Coordinate>>(filename);
                else
                    coords = new List<Coordinate>();
    
                // Add some new items to the list.
    
                int n = coords.Count;
    
                for (int i = 0; i < 5; ++i)
                {
                    int j = n + i;
    
                    coords.Add(new Coordinate
                    {
                        DateTime    = date,
                        BeaconID    = "ID" + j,
                        XCoordinate = "X" + j,
                        YCoordinate = "Y" +j
                    });
                }
    
                // Print the BeaconID of the last item in the list.
    
                Console.WriteLine(coords[coords.Count-1].BeaconID);
    
                // Save the amended list.
    
                SerializeToFile(coords, filename);
            }
    
            public static void SerializeToFile<T>(T item, string xmlFileName)
            {
                using (FileStream stream = new FileStream(xmlFileName, FileMode.Create, FileAccess.Write))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    serializer.Serialize(stream, item);
                }
            }
    
            public static T DeserializeFromFile<T>(string xmlFileName) where T: class
            {
                using (FileStream stream = new FileStream(xmlFileName, FileMode.Open, FileAccess.Read))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return serializer.Deserialize(stream) as T;
                }
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.IO;
    使用System.Xml.Serialization;
    名称空间演示
    {
    公共类坐标
    {
    公共字符串日期时间{get;set;}
    公共字符串信标ID{get;set;}
    公共字符串XCoordinate{get;set;}
    公共字符串YCoordinate{get;set;}
    }
    公共静态类程序
    {
    公共静态void Main()
    {
    var date=DateTime.Now.ToString();
    字符串filename=“D:\\TMP\\TEST.XML”;
    列出合作伙伴;
    //反序列化现有列表,如果不存在,则创建一个空列表。
    if(File.Exists(filename))
    coords=反序列化FromFile(文件名);
    其他的