Toon posts:

[C#] Wegschrijven naar XML overschrijft bestaande gegevens

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit misschien een nogal basic vraag maar ik kom er nu echt even niet uit.

Ik ben nog maar een tijdje bezig in C# en ik ben nu bezig met userinput weg te schrijven naar een XML bestand door middel van de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string artist = ArtistBox.Text.ToString();
string album = AlbumBox.Text.ToString();
string year = YearBox.Text.ToString();
XDocument Cdcoldoc =
    new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XComment("Your music inventory"),
        new XElement("CDCol",
            new XElement("Item",
                new XElement("Artist", artist),
                new XElement("Album", album),
                new XElement("Year", year)
            )
        )
    );
        Cdcoldoc.Save(@"C:\CDcoldoc.xml");
}
    catch (IOException Ex){
        MessageBoxResult Error;
        Error = MessageBox.Show(Ex.ToString(), "Error!", MessageBoxButton.OK);
}


Dit werkt opzich prima en resulteert in het volgende bestand waneer de user bijvoorbeeld overal blaat invult:
XML:
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Your music inventory-->
<CDCol>
  <Item>
    <Artist>blaat</Artist>
    <Album>blaat</Album>
    <Year>blaat</Year>
  </Item>
</CDCol>


Echter wanneer de gebruiker bijvoorbeeld andere gegevens invult, voor het idee bijvoorbeeld blah, komt er het volgende uit:
XML:
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Your music inventory-->
<CDCol>
  <Item>
    <Artist>blah</Artist>
    <Album>blah</Album>
    <Year>blah</Year>
  </Item>
</CDCol>


Kortom, hij overschrijft oude input met nieuwe input.
Nu is mijn vraag: Hoe kan ik voorkomen dat dit gebeurt en gewoon een nieuw item toevoegt, dus bijvoorbeeld zoiets?:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Your music inventory-->
<CDCol>
  <Item>
    <Artist>blaat</Artist>
    <Album>blaat</Album>
    <Year>blaat</Year>
  </Item>
  <Item>
    <Artist>blah</Artist>
    <Album>blah</Album>
    <Year>blah</Year>
  </Item>
</CDCol>


Alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 18:25

Twazerty

AVCHDCoder developer

Volgens mij mis je een loopje?

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm, had ik zelf ook al over nagedacht, zat er alleen een beetje mee hoe je je data op de goede plek krijgt en niet achter de sluittag van CDCol. Iemand daar enige ideeën over?

Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Volgens mij zoek je iets als:


C#:
1
2
XmlElement newElement = Cdcoldoc.CreateElement("Item");
Cdcoldoc.DocumentElement.AppendChild(newElement);

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

Verwijderd

Deserialize als eerste je XML bestand uit naar een Array/List Object, vervolgens stop je de input van de user ook in deze Array/List erbij en Serialize het vervolgens opnieuw. Hier moet je maar eens even kijken naar de Get; en Set; accessors

[ Voor 13% gewijzigd door Verwijderd op 29-03-2009 21:18 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
oke even een kleine update want ik kom er weer niet uit :/

de code ziet er nu zoiets uit:
C#:
1
2
3
4
5
6
7
8
Input userinput = new Input();
using (Stream fStream = new FileStream(@"C:\col.xml", FileMode.Create, FileAccess.Write, FileShare.None)) {
    XmlSerializer x = new XmlSerializer(userinput.GetType());
    userinput.Item.Add(ArtistBox.Text.ToString());
    userinput.Item.Add(AlbumBox.Text.ToString());
    userinput.Item.Add(YearBox.Text.ToString());
    x.Serialize(fStream, userinput);
}


Met de Input class:
C#:
1
2
3
4
5
6
7
public class Input {
    private List<string> itemList = new List<string>();
    public List<string> Item {
        get {return itemList;}
        set {itemList = value;}
    }
}


Dit resulteert bijvoorbeeld in deze xml code:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Item>
    <string>blaat</string>
    <string>blaat</string>
    <string>blaat</string>
  </Item>
</Input>


Zoals je ziet mikt hij alles in een string ipv de namen behouden, en daadoor lukt het mij niet om hier nog bruikbare informatie uit te halen. Hoe zorg ik ervoor dat hij bijvoorbeeld zoiets eruit krijg:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Item>
    <artist>blaat</artist>
    <album>blaat</album>
    <year>blaat</year>
  </Item>
</Input>


En hoe deserialize ik het gebeuren weer fatsoenlijk? Ik dacht zelf aan ongeveer wat vdevos zei, derserialize naar een list en dan weer serializen, maar hoe pak dit ongeveer aan?

Alvast bedankt :)

Acties:
  • 0 Henk 'm!

Verwijderd

Door artist, album, en year properties van Input te maken ipv alles zo als string in een List<T> te prutten in Input. Hoe moet de (de)serializer anders uitvogelen dat jij niet een lijst van strings bedoeld maar eigenlijk artist, album en year? Waar vdevos op doelt is dat je uiteindelijk een List van Input objecten moet serializeren om ervoor te zorgen dat er meer dan 1 in je XML komt te staan.

Tip: Introducing XML Serialization

offtopic:
Input: wat een naam trouwens, beschrijft input de data die wordt ge-encapsuleerd / functionaliteit die het op deze data aanbiedt?
Pagina: 1