C# Xml Zapisywanie i Odczytywanie

Odpowiedz Nowy wątek
2018-01-30 20:49

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

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;
        }
    }
edytowany 1x, ostatnio: MrDarkne, 2018-01-30 20:49

Pozostało 580 znaków

2018-01-30 21:14

Rejestracja: 17 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Kraków

1

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


It's easy to hate code you didn't write, without an understanding of the context in which it was written.

Pozostało 580 znaków

2018-02-07 11:16

Rejestracja: 3 lata temu

Ostatnio: 3 miesiące temu

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.

Pozostało 580 znaków

2018-02-07 14:44

Rejestracja: 5 lat temu

Ostatnio: 2 lata temu

0

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

P

edit: albo jakas baza typu sqllite mssqlcompact.

edytowany 1x, ostatnio: fprogrammer, 2018-02-07 14:45

Pozostało 580 znaków

Odpowiedz

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