Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# XML - Dodawanie danych do pliku xml

adriano1191 07 Kwi 2015 17:03 948 9
  • #1 07 Kwi 2015 17:03
    adriano1191
    Poziom 10  

    Witam, ostatnio zacząłem się uczyć C# i postanowiłem napisać dosyć prosty programik który ma zapisywać kilka danych w pliku xml. Potrafię stworzyć taki plik i umieścić w nim dane, problem pojawia się w momencie gdy staram się dodać coś do tego pliku. Za każdym razem nadpisuję już istniejące wartości. I tutaj powstaje moje pytanie do was, co zrobić żeby program dodawał a nie nadpisywał dane.
    Piszę w VisualStudio 2013.
    C#

    Spoiler:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    XML
    Spoiler:
    Kod: xml
    Zaloguj się, aby zobaczyć kod

    0 9
  • Pomocny post
    #2 07 Kwi 2015 17:32
    wiesniak
    Poziom 31  

    Obsługa plików xml jest podobna do obsługi innych plików w tym, że pisanie do pliku będzie nadpisywać Ci treść (albo dopisywać na koniec - choć raczej nie w przypadku xml).
    Jeśli byś chciał modyfikować, musisz najpierw wczytać plik, a później go zmieniać.
    Proponuję jedną z trzech opcji:
    1. Serializacja i deserializacja klas.
    2. Linq to XML (System.Linq.Xml).
    3. Użycie obiektów z przestrzeni nazw System.Xml.
    Kolejność odpowiada "priorytetowi" propozycji (czyli sam bym zrobił to przez serializację i deserializację).

    1
  • #3 07 Kwi 2015 19:15
    adriano1191
    Poziom 10  

    Udało mi się dodać dane za pomocą serializacji, tylko że ugrzęzłem w tym samym miejscu ciągle je nadpisuję. Domyślam się że trzeba ją zdeserializować i wtedy do niej jakoś dodawać resztę danych tylko nie bardzo wiem jak.

    0
  • Pomocny post
    #4 07 Kwi 2015 19:25
    wiesniak
    Poziom 31  

    Dobrze się domyślasz. Deserializujesz i modyfikujesz obiekty.
    Zgaduję, że chcesz zapisywać listę serwerów, czyli masz mniej-więcej takie klasy (atrybuty nie są potrzebne - wtedy nazwy w xml pokrywają się z nazwami w klasach):

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    W takim wypadku, jak zdeserializujesz, będziesz miał obiekt klasy Servers i jedyne co musisz zrobić, to zmodyfikować kolekcję ServersList wg własnych potrzeb, po czym zserializować i zapisać.

    1
  • #5 07 Kwi 2015 20:36
    adriano1191
    Poziom 10  

    Wiele rzeczy mi naprawdę wyjaśniłeś, ale od tego wszystkiego całkowicie zgłupiałem i chwilowo dam sobie na luz z tym.

    0
  • #6 08 Kwi 2015 13:01
    adriano1191
    Poziom 10  

    Dzisiaj postanowiłem jeszcze nad tym posiedzieć ale jak bym tego nie zrobił zawsze mam ten sam efekt.
    Write

    Spoiler:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Read
    Spoiler:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Spoiler:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #7 08 Kwi 2015 13:06
    wiesniak
    Poziom 31  

    Zwróć uwagę na zasięg zmiennych. W Read deserializujesz, po czym metoda się kończy i obiekt przestaje być dostępny, bo go nie zwracasz nigdzie.
    Niech Read zwraca projectInfo, który później zmodyfikujesz, a na koniec zapiszesz.

    1
  • #8 08 Kwi 2015 14:11
    adriano1191
    Poziom 10  

    Rozumiem o co Ci chodzi, wiem gdzie mam błąd ale kurcze nie potrafię tego jakoś poprawnie napisać.

    0
  • Pomocny post
    #9 08 Kwi 2015 14:20
    wiesniak
    Poziom 31  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Do przemyślenia, czy obiekt serializer to musi być forma (sądząc po nazwie) - może wystarczy zwykła klasa.

    1
  • #10 08 Kwi 2015 14:56
    adriano1191
    Poziom 10  

    Z tym co mi wysłałeś, wieczorkiem jak wrócę do domu może coś uda mi się zdziałać. Gdybyś mocno się nudził możesz podejrzeć mój projekt.
    Uprzedzam że jestem totalnym amatorem w tym bo tak naprawdę miałem dopiero jedną godzinę z Visualem i C# i w domu w wolnej chwili staram się sam trochę pouczyć.
    PS. Wielkie dzięki za wszystko.

    0