C# Daten aus XML löschen

denn1995

Cadet 1st Year
Registriert
Mai 2011
Beiträge
9
Hallo,

ich bin momentan bei ein kleines Projekt zu entwerfen.
Ich erstelle mit dem Programm eine XML, wo ich ein paar Daten abspeichere, dies geht auch ohne Probleme.
Nur beim löschen gibt es Probleme

Das Programm hat eine ListBox, wo Namen abgespeichert werden. Sobald ich auf einen Namen klicke, erscheinen in den TextBoxen die Daten aus der XML.

Ich möchte, das ich den Makierten Namen inkl. die Daten aus den TextBoxen aus der XML lösche.

Hier der Code zum Hinzufügen:
Code:
        private void btnAdd_Click(object sender, EventArgs e)
        {

           //hlist.xml laden
           XDocument xmlFile = new XDocument();
           xmlFile = XDocument.Load("hlist.xml");

           if (!File.Exists("hlist.xml"))
           {
               XElement root = new XElement("Root");
           }
           else
           {
            //Daten zur Liste hinzufügen
            xmlFile.Root.Add(
                new XElement("Einschicken",
                    new XElement("Hersteller",
                        new XElement("Name", txtName.Text),
                            new XElement("Kundennummer", txtKd.Text),
                            new XElement("Telefon", txtTel.Text),
                            new XElement("Fax", txtFax.Text),
                            new XElement("Website", txtWebsite.Text),
                            new XElement("Email", txtEmail.Text),
                            new XElement("Info", rtxtInfo.Text),
                            new XElement("Von", txtTimeFrom.Text),
                            new XElement("Bis", txtTimeTo.Text)
                            )
                        )
                    );

               //Liste speichern
               xmlFile.Save("hlist.xml");
               //Name in der RichTextBox einfügen
               lbName.Items.Add(txtName.Text);
           }
        }

Und hier der Code zum löschen:

Code:
        private void btnRemove_Click(object sender, EventArgs e)
        {
            XDocument xmlFile = new XDocument();
            xmlFile = XDocument.Load("hlist.xml");

            string curItem1 = lbName.SelectedItem.ToString();

            var name = (from xNode in xmlFile.Root.Descendants("Hersteller") where xNode.Element("Name").Value == curItem1 select xNode.Element("Name").Value).FirstOrDefault();
            var kd = (from xNode in xmlFile.Root.Descendants("Hersteller") where xNode.Element("Name").Value == curItem1 select xNode.Element("Kundennummer").Value).FirstOrDefault();
            var tel = (from haha in xmlFile.Root.Descendants("Hersteller") where haha.Element("Name").Value == curItem1 select haha.Element("Telefon").Value).FirstOrDefault();
            var fax = (from xNode in xmlFile.Root.Descendants("Hersteller") where xNode.Element("Name").Value == curItem1 select xNode.Element("Fax").Value).FirstOrDefault();
            var website = (from xNode in xmlFile.Root.Descendants("Hersteller") where xNode.Element("Name").Value == curItem1 select xNode.Element("Website").Value).FirstOrDefault();
            var email = (from haha in xmlFile.Root.Descendants("Hersteller") where haha.Element("Name").Value == curItem1 select haha.Element("Email").Value).FirstOrDefault();
            var info = (from haha in xmlFile.Root.Descendants("Hersteller") where haha.Element("Name").Value == curItem1 select haha.Element("Info").Value).FirstOrDefault();
            var timefrom = (from haha in xmlFile.Root.Descendants("Hersteller") where haha.Element("Name").Value == curItem1 select haha.Element("Von").Value).FirstOrDefault();
            var timeto = (from haha in xmlFile.Root.Descendants("Hersteller") where haha.Element("Name").Value == curItem1 select haha.Element("Bis").Value).FirstOrDefault();
 
            //Löschen funkt. nicht!!!!!
            XElement root = new XElement("Root",
                new XElement("Einschicken",
                    new XElement("Hersteller",
                        new XElement("Name", txtName.Text),
                            new XElement("Kundennummer", txtKd.Text),
                            new XElement("Telefon", txtTel.Text),
                            new XElement("Fax", txtFax.Text),
                            new XElement("Website", txtWebsite.Text),
                            new XElement("Email", txtEmail.Text),
                            new XElement("Info", rtxtInfo.Text),
                            new XElement("Von", txtTimeFrom.Text),
                            new XElement("Bis", txtTimeTo.Text)
                            )
                        )
                    );

            root.RemoveAll();
            lbName.Items.Remove(name);
            
            xmlFile.Save("hlist.xml");
        }
    }
}

Ich hoffe mir kann jemand helfen, da ich noch am lernen bin.
Mfg
Dennis
 
Ganz durchsteige ich deinen Code nicht.

Tip 1) Versuch zu erst mit weniger LINQ zu arbeiten (Resharper-Verbesserung?!)
Tip 2) Baue nicht immer das vollständige XML-Auf und Lösche, sonder versuche eher punktuell zu argieren. Sprich, wenn ein Update kommt, update eine XElement, wenn ein Delete kommt lösche ein XElement

so aber was ich lese ich:
  1. Lade XML
  2. Baue XML-Baum aus UI / Datenstruktur auf
  3. Hänge Datenstruktur als Wurzel ein (die keinen Bezug zum XML hat)
  4. Lösche alle Element aus der Wurzel (dann ist alles weg)
  5. Speichere XML(XDokument) was nie in Verbindung mit der Wurzel (root) stand
--> Es dürfte sich nichts geändert haben

Versuche beim klick im XDocument via Descendant das XElement zu finden. Nutze den Parent und entferne dann dort das gefunden XElement

Ich hoffe es ist einiger maßen verständlich
 
Wenn ich das richtig sehe legst Du ein XElement Objekt unabhängig von Deinem XDocument Objekt an, weißt dem Element strings aus der GUI zu und rufst auf dem Element RemoveAll auf. Was soll da auch passieren?

Edit: Das Xdocument hat eine remove Methode: https://msdn.microsoft.com/de-de/library/system.xml.linq.xdocument_methods(v=vs.110).aspx

Hier ein CodeBeispiel: https://msdn.microsoft.com/de-de/library/system.xml.linq.xnode.remove(v=vs.110).aspx

Sieht für mich so aus, als ob Du Dir den Node raussuchen musst, also eine Referenz auf das Objekt aus dem XDocument haben musst, und auf dem Remove aufrufen musst. Remove auf einem anderen, inhaltsgleichem Objekt wird nicht reichen.
 
Zuletzt bearbeitet:
Zurück
Oben