Laden...

XML-Eintrag ändern

Erstellt von oreon vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.394 Views
O
oreon Themenstarter:in
4 Beiträge seit 2004
vor 19 Jahren
XML-Eintrag ändern

Hallo,

ich versuche zur Zeit ein kleines Kassenprogramm mit C# zuverwirklichen. Meine XML-Datei sieht wie folgt aus:


<?xml version="1.0" encoding="utf-8"?>
<lebensmittel>
  <datensatz>
    <warenname>Coca Cola</warenname>
    <stueckpreis>1.50</stueckpreis>
    <bestand>100</bestand>
    <verkauf>0</verkauf>
  </datensatz>
  <datensatz>
    <warenname>Fanta</warenname>
    <stueckpreis>1.50</stueckpreis>
    <bestand>50</bestand>
    <verkauf>0</verkauf>
  </datensatz>
</lebensmittel>

So jetzt verkaufe ich ein(nig)e Flaschen einer Art, d.h. '<bestand>' nimmt ab und '<verkauf>' steigt. Also will ich diese Änderung in der XML-Datei speichern. Mein
Ansatz sieht so:


//In lebensmittel.xml speichern
string strDatei_lebensmittel_verkaufen=Application.StartupPath + "\\lebensmittel.xml";
bool boolGefunden=false;
XmlDocument xmldDoc_lebensmittel_verkaufen=new XmlDocument();
XmlElement xmlElem_lebensmittel_verkaufen;
XmlNode xmlElem2_lebensmittel_verkaufen;
XmlNode xmlElem3_lebensmittel_verkaufen;
XmlNodeList xmlNodes_lebensmittel_verkaufen;
//Laden der Datei
xmldDoc_lebensmittel_verkaufen.Load(strDatei_lebensmittel_verkaufen);
//Ermitteln des Root-Elements
xmlElem_lebensmittel_verkaufen=xmldDoc_lebensmittel_verkaufen.DocumentElement;
xmlNodes_lebensmittel_verkaufen=xmlElem_lebensmittel_verkaufen.GetElementsByTagName("datensatz");
for (int intI=0;intI<xmlNodes_lebensmittel_verkaufen.Count;intI++)
{
	xmlElem2_lebensmittel_verkaufen=xmlNodes_lebensmittel_verkaufen[intI];
	//durchsuchen der Datensätze
	for (int intJ=0;intJ<xmlElem2_lebensmittel_verkaufen.ChildNodes.Count;intJ++)
	{
		//Nach Warenname suchen(Coca Cola bzw. Fanta)
		if (xmlElem2_lebensmittel_verkaufen.ChildNodes[intJ].InnerText==readwarenname)
		{
			boolGefunden=true;
		}
	}
	if (boolGefunden==true)
	{
		//Alle Unterknoten druchlaufen.
		for (int intJ=0;intJ<xmlElem2_lebensmittel_verkaufen.ChildNodes.Count;intJ++)
		{
			//Hier muss es irgendwas rein um Bestand/Verkauf zuverändern
		}
		return;
	}
}

Meine Frage ist jetzt wie das zu realisieren ist. Bitte schreibt nicht: "ich das komplett anders angehen...", ausser natürlich die Möglichkeiten von XML sind hier ausgeschopft(was aber glaub ich nicht zu trifft). Also bitte nur Vorschläge die sich in meinen Ansatz einfügen(immer vorrausgesetzt das es mit meinem Ansatz überhaupt möglich ist).

Danke
Oreon

R
139 Beiträge seit 2004
vor 19 Jahren

Hallo,

also ein kleiner tipp vorweg, achte auf deine variabelbezeichnungen dh.:

1.) kurz und deutlich.

XmlElement xmlElem_lebensmittel_verkaufen;
XmlNode xmlElem2_lebensmittel_verkaufen;
XmlNode xmlElem3_lebensmittel_verkaufen;

Node == Element für dich?

<- mir kams eher vor als wenn ich ein aufsatz durchlese, und in fast jeder zeile lebensmittel_verkaufen gesehen habe (verfolgungswahn).

2.) jeder der die forschleife kennt weiß dass die zählvariabel vom typ int ist

for (int intI=0;intI<xmlNodes_lebensmittel_verkaufen.Count;intI++)

außerdem wird mit dieser lokalen var nicht "viel angefangen".

Du hast die wahl zwischen die gewünschte zeile in der datei zu ändern (also nachdem du alles elemente durch hast), was ich dir nicht empfehle, oder du erstellst parallel eine neue datei mit der änderung was du dann später mit dem orig. machst bleibt dir überlassen.

gruß,

r00t

posted by the real prince of persia

F
10.010 Beiträge seit 2004
vor 19 Jahren

Sieht mir ganz nach einem theoretischen Schul-Projekt aus.


  using System.IO;
  using System.Xml;
  using System.Xml.XPath;

    private void Aendere_BestandXml( string Artikel, int Aenderung)
    {
      XmlDocument xdoc = new XmlDocument();
      xdoc.Load(Path.Combine(Application.StartupPath,"Lebensmittel.xml"));
      XmlNodeList Nodes = xdoc.SelectNodes("/lebensmittel/datensatz/warenname");
      foreach( XmlNode xn in Nodes )
      {
        if( xn.InnerText == Artikel )
        {
          xn.ParentNode["bestand"].InnerText = (Convert.ToInt32( xn.ParentNode["bestand"].InnerText) - Aenderung).ToString();
          xn.ParentNode["verkauf"].InnerText = (Convert.ToInt32( xn.ParentNode["verkauf"].InnerText) + Aenderung).ToString();
        }
      } // foreach( XmlNode xn in Nodes )
      xdoc.Save(Path.Combine(Application.StartupPath,"Lebensmittel.xml"));
    }