Witam wszystkich !
Niezbyt umiem ogarnąć XMLReader-a by stworzyć sobie metodę ReadXml interfejsu XMLSerializable. Gdyż spotykam się najczęściej z przykładami obiektów z jednym polem .
Więc stworzyłem własny sposób zapisu i odczytu do/z XML.
Ale nie wiem czy taka metoda jest funkcjonalna patrząc na zastosowanie w przyszłości (poza tym że wstępnie funkcjonuje).
I prosiłbym o waszą opinie na ich temat .
Z góry dziękuje za opinie i poświęcony czas .
Nasz obiekt
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Biblioteczka
{
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.Xml;
using System.Linq;
enum Pola
{
id_ksiazki,
tytul,
id_autor,
id_wydawnictwo,
id_kategoria,
liczbastron,
druk,
pdf,
mobi,
epub,
przeczytana
};
[Serializable]
public partial class Ksiażka : IComparable<Ksiażka>
{
public int Id_ksiazki { get; set; }
public string Tytuł { get; set; }
public Nullable<short> Liczba_stron { get; set; }
public Nullable<bool> Druk { get; set; }
public Nullable<bool> Pdf { get; set; }
public Nullable<bool> Mobi { get; set; }
public Nullable<bool> Epub { get; set; }
public Nullable<bool> Przeczytana { get; set; }
public virtual Autor Autor { get; set; }
public virtual Kategoria Kategoria { get; set; }
public virtual Wydawnictwo Wydawnictwo { get; set; }
public int CompareTo(Ksiażka jaka)
{
return this.Tytuł.CompareTo(jaka.Tytuł);
}
/////////////////////////////////////////////////////////////////////
////////////////////////Serializacja/////////////////////////////////
/////////////////////////////////////////////////////////////////////
public void WriteXml(XmlWriter writer, string[] nazwy)
{
writer.WriteStartElement("Książka");
writer.WriteElementString(nazwy[(int)Pola.id_ksiazki], this.Id_ksiazki.ToString());
writer.WriteElementString(nazwy[(int)Pola.tytul], this.Tytuł);
writer.WriteElementString(nazwy[(int)Pola.id_autor], this.Autor == null ? "Brak" : this.Autor.Id_autor.ToString());
writer.WriteElementString(nazwy[(int)Pola.id_wydawnictwo], this.Wydawnictwo == null ? "Brak" : this.Wydawnictwo.Id_wydawnictwo.ToString());
writer.WriteElementString(nazwy[(int)Pola.id_kategoria], this.Kategoria == null ? "Brak" : this.Kategoria.Id_kategoria.ToString());
writer.WriteElementString(nazwy[(int)Pola.liczbastron], this.Liczba_stron.ToString());
writer.WriteElementString(nazwy[(int)Pola.druk], this.Druk == null ? false.ToString() : this.Druk.ToString());
writer.WriteElementString(nazwy[(int)Pola.pdf], this.Pdf == null ? false.ToString() : this.Pdf.ToString());
writer.WriteElementString(nazwy[(int)Pola.mobi], this.Mobi == null ? false.ToString() : this.Mobi.ToString());
writer.WriteElementString(nazwy[(int)Pola.epub], this.Epub == null ? false.ToString() : this.Epub.ToString());
writer.WriteElementString(nazwy[(int)Pola.przeczytana], this.Przeczytana == null ? false.ToString() : this.Przeczytana.ToString());
writer.WriteEndElement();
}
public void ReadXml(XmlNode ksiazka, string[] nazwy)
{
using (biblioteczkaEntities polaczenie = new biblioteczkaEntities())
{
this.Id_ksiazki = Convert.ToInt32(ksiazka[nazwy[(int)Pola.id_ksiazki]].InnerText);
this.Tytuł = ksiazka[nazwy[(int)Pola.tytul]].InnerText;
string id_autor = ksiazka[nazwy[(int)Pola.id_autor]].InnerText;
if (id_autor.CompareTo("Brak") != 0)
{
int id = Convert.ToInt32(id_autor);
this.Autor = polaczenie.Autor.FirstOrDefault(k => k.Id_autor == id);
}
string id_wydawnictwo = ksiazka[nazwy[(int)Pola.id_wydawnictwo]].InnerText;
if (id_wydawnictwo.CompareTo("Brak") != 0)
{
int id = Convert.ToInt32(id_wydawnictwo);
this.Wydawnictwo = polaczenie.Wydawnictwo.FirstOrDefault(k => k.Id_wydawnictwo == id);
}
string id_kategoria = ksiazka[nazwy[(int)Pola.id_kategoria]].InnerText;
if (id_kategoria.CompareTo("Brak") != 0)
{
int id = Convert.ToInt32(id_kategoria);
this.Kategoria = polaczenie.Kategoria.FirstOrDefault(k => k.Id_kategoria == id);
}
this.Liczba_stron = (short?)Convert.ToInt32(ksiazka[nazwy[(int)Pola.liczbastron]].InnerText);
this.Druk = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.druk]].InnerText);
this.Pdf = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.pdf]].InnerText);
this.Mobi = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.mobi]].InnerText);
this.Epub = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.epub]].InnerText);
this.Przeczytana = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.przeczytana]].InnerText);
}
}
}
}
Użycie metod ReadXML i WriteXML
private void serializacjaToolStripMenuItem_Click(object sender, EventArgs e)
{
string[] nazwy_serializacja = { "Id_ksiazki", "Tytuł", "Id_autor", "Id_wydawnictwo", "Id_kategoria", "Liczba_stron", "Druk", "Pdf", "Mobi", "Epub", "Przeczytana" };
using (biblioteczkaEntities polaczenie = new biblioteczkaEntities())
{
try
{
//////////////////////////////////////////
//////////////odczyt//////////////////////
/////////////////////////////////////////
XmlDocument doc = new XmlDocument();
doc.Load("books.xml");
XmlNodeList lista = doc.GetElementsByTagName("Książka");
foreach (XmlNode book in lista)
{
Ksiażka ksiazka = new Ksiażka();
ksiazka.ReadXml(book, nazwy_serializacja);
MessageBox.Show(ksiazka.Tytuł + " " + ksiazka.Autor.ToString());
}
///////////////////////////////////////////
//////////////zapisz//////////////////////
/////////////////////////////////////////
List<Ksiażka> ksiazki = polaczenie.Ksiażka.ToList();
XmlWriterSettings settings = new XmlWriterSettings();
settings.NewLineOnAttributes = true;
settings.Indent = true;
settings.IndentChars = ("\t");
settings.OmitXmlDeclaration = true;
using (XmlWriter writer = XmlWriter.Create("books.xml", settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("Książki");
foreach (Ksiażka k in ksiazki)
{
k.WriteXml(writer, nazwy_serializacja);
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
catch (Exception oException)
{
MessageBox.Show(oException.Message);
}
}
}