C# Xml Zapisywanie i Odczytywanie

0

Witam. Piszę program, w którym między innymi obliczam średnią. Chce żeby zapisywać klasy, ale coś mi nie działa. Nie wyskakuje błąd ale podczas wczytywania uczniowie się wczytywają a oceny nie. Proszę o pomoc:
Save:

if (Uczen.Uczniowe.Count != 0)
            {
                XDocument xml = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("Uczen",
                from Uczen in Uczen.Uczniowe
                select new XElement("Uczen",
                new XElement("Imie", Uczen.Imie),
                new XElement("Nazwisko", Uczen.Nazwisko),
                new XElement("Czy", Uczen.Czy),
                new XElement("Ocena",
                    from Mark in Uczen.Oceny
                    select new XElement("Ocena",
                    new XAttribute("Mark", Mark.Mark),
                    new XAttribute("Srednia", Mark.Srednia * 10),
                    new XElement("Komentarz", Mark.Komentarz),
                    new XAttribute("Data", Mark.Data),
                    new XElement("Czy",Mark.Czy)))
            )));
                xml.Save(path);
                path.Close();
            }

Odczyt:

XDocument xml = XDocument.Load(path);
            Uczen.Uczniowe = (
                from Uczen in xml.Root.Elements("Uczen")
                select new Uczen(
                Uczen.Element("Imie").Value,
                Uczen.Element("Nazwisko").Value,
                Convert.ToBoolean(Uczen.Element("Czy").Value),
                    new List<Ocena>(
                    from Oc in xml.Root.Elements("Ocena")
                    select new Ocena(
                        Oc.Attribute("Mark").Value,
                        Oc.Attribute("Srednia").Value,
                        new Label(),
                        Convert.ToDateTime(Oc.Attribute("Data").Value),
                        Oc.Element("Komentarz").Value,
                        Convert.ToBoolean(Oc.Element("Czy").Value))
                    ).ToList<Ocena>())
                ).ToList<Uczen>();

Klasa Uczeń:

public class Uczen
    {
        public string Imie;
        public bool Czy;
        public static List<Uczen> Uczniowe = new List<Uczen>();
        public int Id;
        public string Nazwisko;
        public GroupBox Pole;
        public List<Ocena> Oceny;
        public Uczen(string imie,string nazwisko, bool czy,List<Ocena> li)
        {
            Czy = czy;
            Imie = imie;
            Nazwisko = nazwisko;
            Pole = new GroupBox();
            Oceny = new List<Ocena>();
            Uczniowe.Add(this);
            Id = 1+Uczniowe.IndexOf(this);
            Oceny = li;
        }
    }

Klasa Ocena:

public class Ocena
    {
        public double Mark;
        public bool Czy;
        public double Srednia;
        public Label Label;
        public string Komentarz;
        public DateTime Data;
        public Ocena(string mark, string srednia,Label label, DateTime data, string komentarz,bool czy)
        {
            Czy = czy;
            srednia.Replace(".", ",");
            mark.Replace(".", ",");
            double.TryParse(mark, out Mark);
            Srednia = Convert.ToDouble(srednia);
            Srednia /= 10;
            Label = label;
            Komentarz = komentarz;
            Data = data;
        }
        public static Ocena Szukaj_Label(Label find, List<Ocena> lista)
        {
            Ocena kon = null;
            foreach(Ocena oc in lista)
            {
                if(oc.Label==find)
                {
                    kon = oc;
                }
            }
            return kon;
        }
        public static Ocena Szukaj(double ocena, double srednia, string kom, List<Ocena> lista)
        {
            Ocena kon = null;
            foreach (Ocena oc in lista)
            {
                if (oc.Mark==ocena&&oc.Srednia==srednia&&oc.Komentarz==kom)
                {
                    kon = oc;
                }
            }
            return kon;
        }
    }
1

A myślałeś może nad użyciem xmlserializer albo datacontractserializer zamiast linq to xml? kod były znacznie prostszy i czytelniejszy....

0

Jeśli nie musi być użyty xml, to polecam użyć lokalnych plików baz danych sql. program się skróci do kilku linijek.

0

Kolega Neves Ci dobrze proponuje.
Dodatkowo adnotacjami można miec stosunkową kontrole na zapisywanym obiektem.

P

edit: albo jakas baza typu sqllite mssqlcompact.

1 użytkowników online, w tym zalogowanych: 0, gości: 1