.NET 4.x Автоматическая сериализация кллекции XmlSerializer.Serialize(); - C#
Формулировка задачи:
Доброго времени суток.
Помогите пожалуйста разобраться с XML сериализацией.
Делаю телефонный справочник. Есть класс Person, у которого есть свойства: Name, Phone, Address, Email, Birthday. который хранит все данные в коллекции List<Person> Необходимо, чтобы при добавлении нового контакта, данные записывались в XML файл. Для этого нужно использовать XmlSerializer.Serialize(); которому, как я понимаю, я должен подсунуть объект типа Person и структуру XML в виде XSD файла.
XSD я читал, можно сделать при помощи утилиты xsd.exe но с уже готового XML!? Которого у меня пока нет.
Код ниже. Спасибо.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Xml; using System.Xml.Serialization; namespace PhoneBook { public partial class Form1 : Form { List<Person> people = new List<Person>(); public Form1() { InitializeComponent(); listView1.View = View.List; } private void Form1_Load(object sender, EventArgs e) { string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); // Read from XML file when App is Opened if (!File.Exists(path + "\\PhoneBook\\settings.xml")) return; XmlDocument xDoc = new XmlDocument(); try { xDoc.Load(path + "\\PhoneBook\\settings.xml"); foreach (XmlNode xNode in xDoc.SelectNodes("People/Person")) { //Select the node inside xml Person p = new Person(); p.Name = xNode.Attributes["Name"].InnerText; p.Phone = xNode.Attributes["Phone"].InnerText; p.StreetAddress = xNode.Attributes["StreetAddress"].InnerText; p.Email = xNode.Attributes["Email"].InnerText; p.Birthday = DateTime.FromFileTime(Convert.ToInt64(xNode.Attributes["Birthday"].InnerText)); people.Add(p); } } catch { return; } UpdateListView(people); } protected override void OnClosed(EventArgs e) { string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (!Directory.Exists(path + "\\PhoneBook")) Directory.CreateDirectory(path + "\\PhoneBook"); if (!File.Exists(path + "\\PhoneBook\\settings.xml")) File.Create("\\PhoneBook\\settings.xml"); XmlTextWriter xw = new XmlTextWriter(path + "\\PhoneBook\\settings.xml", Encoding.UTF8); xw.WriteStartElement("People"); foreach (Person item in people) { XmlSerializer xx = new XmlSerializer(typeof(Person)); xx.Serialize(xw, item); //xw.WriteStartElement("Person"); //xw.WriteAttributeString("Name", item.Name); //xw.WriteAttributeString("Phone", item.Phone); //xw.WriteAttributeString("StreetAddress", item.StreetAddress); //xw.WriteAttributeString("Email", item.Email); //xw.WriteAttributeString("Birthday", item.Birthday.ToFileTime().ToString()); //xw.WriteEndElement(); } xw.WriteEndElement(); xw.Close(); base.OnClosed(e); } private void button2_Click(object sender, EventArgs e) { Person p = new Person(); p.Name = textBox1.Text; p.Phone = textBox2.Text; p.StreetAddress = textBox3.Text; p.Email = textBox4.Text; p.Birthday = dateTimePicker1.Value; people.Add(p); //adding created person to the List<> textBox1.Text = String.Empty; textBox2.Text = String.Empty; textBox3.Text = String.Empty; textBox4.Text = String.Empty; dateTimePicker1.Value = DateTime.Now; UpdateListView(people); } private void listView1_SelectedIndexChanged(object sender, EventArgs e) { if (listView1.SelectedItems.Count == 0) { textBox1.Text = textBox2.Text = textBox3.Text = textBox4.Text = string.Empty; } else { textBox1.Text = people[listView1.SelectedItems[0].Index].Name; textBox2.Text = people[listView1.SelectedItems[0].Index].Phone; textBox3.Text = people[listView1.SelectedItems[0].Index].StreetAddress; textBox4.Text = people[listView1.SelectedItems[0].Index].Email; dateTimePicker1.Value = people[listView1.SelectedItems[0].Index].Birthday; } } private void button3_Click(object sender, EventArgs e) { Remove(); } private void UpdateListView(List<Person> list) { listView1.Items.Clear(); foreach (var item in list) listView1.Items.Add(item.ToString()); } void Remove() //Method deletes items from the ListView { try { listView1.Items.Remove(listView1.SelectedItems[0]); people.RemoveAt(listView1.SelectedItems[0].Index); } catch { } } private void removeToolStripMenuItem_Click(object sender, EventArgs e) //Context menu Remove (doesn't work) { Remove(); } private void button1_Click(object sender, EventArgs e) //Save Changes { people[listView1.SelectedItems[0].Index].Name = textBox1.Text; people[listView1.SelectedItems[0].Index].Phone = textBox2.Text; people[listView1.SelectedItems[0].Index].StreetAddress = textBox3.Text; people[listView1.SelectedItems[0].Index].Email = textBox4.Text; people[listView1.SelectedItems[0].Index].Birthday = dateTimePicker1.Value; listView1.SelectedItems[0].Text = textBox1.Text; // Change name in the ListView } /* private void Form1_FormClosing(object sender, FormClosingEventArgs e) { XmlDocument xDoc = new XmlDocument(); string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); xDoc.Load(path + "\\PhoneBook\\settings.xml"); XmlNode xNode = xDoc.SelectSingleNode("People"); // Deleting from Xml to avoid copying records xNode.RemoveAll(); foreach (Person p in people) { XmlNode xTop = xDoc.CreateElement("Person"); XmlNode xName = xDoc.CreateElement("Name"); XmlNode xPhone = xDoc.CreateElement("Phone"); XmlNode xStreetAddress = xDoc.CreateElement("StreetAddress"); XmlNode xEmail = xDoc.CreateElement("Email"); XmlNode xBirthday = xDoc.CreateElement("Birthday"); xName.InnerText = p.Name; xPhone.InnerText = p.Phone; xStreetAddress.InnerText = p.StreetAddress; xEmail.InnerText = p.Email; xBirthday.InnerText = p.Birthday.ToFileTime().ToString(); xTop.AppendChild(xName); xTop.AppendChild(xPhone); xTop.AppendChild(xStreetAddress); xTop.AppendChild(xEmail); xTop.AppendChild(xBirthday); xDoc.DocumentElement.AppendChild(xTop); } xDoc.Save(path + "\\PhoneBook\\settings.xml"); }*/ } }
Решение задачи: «.NET 4.x Автоматическая сериализация кллекции XmlSerializer.Serialize();»
textual
Листинг программы
var xx = new XmlSerializer(typeof(List<Person)); using (var stream = File.Create(path + "\\PhoneBook\\settings.xml")) { xx.Serialize(stream, people); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д