XML Einträge hinzufügen und ändern

K

Klinge19

Hi @ll,

Ich habe eine XML Datei geschriben mit folgenem Aufbau.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Adressbuch>
<Adresse>
<Vorname>Hans - Peter</Vorname>
<Nachname>Meyer</Nachname>
.........
</Adresse>
</Adressbuch>


XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"___________.xml", System.Text.Encoding.UTF8);
myXmlTextWriter.Formatting = Formatting.Indented;
myXmlTextWriter.WriteStartDocument(true);


myXmlTextWriter.WriteStartElement("Adressbuch");
myXmlTextWriter.WriteStartElement("Adresse");
myXmlTextWriter.WriteElementString("Vorname", VornameFeld.Text);
myXmlTextWriter.WriteElementString("Nachname", NachnameFeld.Text);
myXmlTextWriter.WriteEndElement();


myXmlTextWriter.Flush();
myXmlTextWriter.Close();


nun wollte ich über mein Programm noch einen Eintrag in die XMl Datei machen.
Problem ist nun. Wie füge ich unter <Adresse> z.b. <Adresse2> ein.

XmlDocument doc = new XmlDocument();
doc.Load(@"Cyberdog\Settings.xml");
XmlElement root = doc.DocumentElement;
//
//Füge hinter dem letzten Punkt die Daten ein
//

Ab hier finde ich leider nichts passendes bei google mehr.
Würde mich über Hilfe freuen.
 
Die passendste Vorgehensweise für deine XML-Daten ist wahrscheinlich, die Daten über eine DataTable oder ein DataSet zu bearbeiten. Im Anhang sind Beispielprogramme, die du noch für deine Zwecke anpassen musst, die zeigen, wie so etwas bewerkstelligt werden kann.
Außerdem empfehle ich dir das C# Codebook, wo auch viele andere nützliche Tipps vorgestellt werden.
 

Anhänge

  • XmlDataChange.txt
    1,8 KB · Aufrufe: 70
  • XmlDataRead.txt
    1,6 KB · Aufrufe: 53
  • XmlDataWrite.txt
    1,7 KB · Aufrufe: 62
Hi.

Naja, ein DataSet ist doch wohl etwas overkill, oder?!

KISS
C#:
var addr = doc.CreateElement("Adresse2");
root.AppendChild(addr);
addr.AppendChild(doc.CreateElement("Name");
..
Gruß
 
Nicht unbedingt. Deine Variante ist natürlich die kürzeste und naheliegendste, aber bei einem DataSet sind die Möglichkeiten für Suchanfragen, Sortierungen und Anzeigen z.B. via DataGridView wesentlicher größer und flexibler.
Dennoch: für ein straight-away-Programm ist deine Methodik wohl am einfachsten zu implementieren.
Es ist eben alles eine Geschmacksfrage.
 
Danke für eure Antworten.
Leider löste es immenroch nicht mein Problem.
Habe das Gefühl, das ich voll auf dem Schlauch stehe und den Wald vor lauter Bäumen nicht mehr sehe.


Code:
if (File.Exists(@"C:\\Eintragungen.xml") == false)
            {
                //Dataset erzeugen und initialisieren
                DataSet dataSet = new DataSet();
                dataSet.DataSetName = "Person";
                dataSet.Namespace = "http://";

                //Tabelle erzeugen
                DataTable dataTable = dataSet.Tables.Add("Person");

                //Spalten definieren
                dataTable.Columns.Add("id", typeof(int));
                dataTable.Columns.Add("Vorname", typeof(string));
                dataTable.Columns.Add("Nachname", typeof(string));
                dataTable.Columns.Add("Name_Komplett", typeof(string));
                dataTable.Columns.Add("Spitzname", typeof(string));
                dataTable.Columns.Add("Email", typeof(string));
                dataTable.Columns.Add("Email_Zwei", typeof(string));
                dataTable.Columns.Add("Haustelefon", typeof(string));
                dataTable.Columns.Add("Handy", typeof(string));
                dataTable.Columns.Add("Fax", typeof(string));
                /*
                 * ...
                */
                
                //Zeilen definieren
                dataTable.Rows.Add(new object[] { 
                    1, 
                    VornameFeld.Text, 
                    NachnameFeld.Text, 
                    NameKomplettFeld.Text, 
                    SpitznameFeld.Text, 
                    EmailFeld.Text, 
                    EmailFeldzwei.Text, 
                    TelefonHausFeld.Text, 
                    HandyFeld.Text, 
                    FaxFeld.Text}
                );
                dataTable.Rows.Add(new object[] { 
                    2, 
                    VornameFeld.Text, 
                    NachnameFeld.Text, 
                    NameKomplettFeld.Text, 
                    SpitznameFeld.Text, 
                    EmailFeld.Text, 
                    EmailFeldzwei.Text, 
                    TelefonHausFeld.Text, 
                    HandyFeld.Text, 
                    FaxFeld.Text}
);

                //XML-Datei mit Schema schreiben
                try
                {
                    dataSet.WriteXml(xmlFileName, XmlWriteMode.WriteSchema);
                }
                catch(System.Exception)
                {

                }

            }

// Bis hier her ist alles komplett klar



---------------------------------------------------------------------

//Ab hier beginnt immernoch leider mein Problem

Code:
            else
            {
                

                //ID auslesen
                //ID um 1 erhöhen
                //ID speichern
                //XML Datensatz unter ID+1 speichern

                /*
                 * Kann man anstatt immer ID mit 1000 zu vergeben auch
                 * ID + 1 machen und dann danach immer einen Datensatz einfügen
                 * und dann wieder
                 * ID + 1
                 * 
                 * Wüsste sonst nicht, wie ich es lösen sollte
                */
----------------------------------------------------------------------------------

//Mein Lösungsversuch,der aber allerdings immernoch scheitert, weil ich unter google nichts passendes finde. Irgendwie stehe ich auf dem Schlauch....

Code:
                //Dataset erzeugen und initialisieren
                DataSet dataset = new DataSet();

                //zu lesende XML Datei bekanntgeben
                dataset.ReadXml(@"C:\\Cyberdog\\Eintragungen.xml");

                //was bewirkt das 
                DataTable DT = dataset.Tables["Person"];
 
Beim Schreiben scheinst du alles Richtig zu machen; du erzeugst ein DataSet, definierst eine Tabelle darin, füllst sie mit Datensätzen und speicherst sie ab.
Beim Abspeichern gibst du richtigerweise XmlWriteMode.WriteSchema an, aber über die Bedeutung scheinst du noch im unklaren zu sein.
Ein DataSet enthält Daten in strukturierter Form; welche Struktur die Daten haben, muss mit abgespeichert werden, damit beim Anlegen auch das DataSet korrekt wieder aufgebaut werden kann. Die Art, wie Daten in einer XML-Datei organisiert sind, wird Schema genannt; ein solches wird durch deinen Parameter automatisch erzeugt und geschrieben. Das Schema wird in einer gesonderten Datei gespeichert, die nicht <filename>.xml heißt, sondern <filename>.xsd.
Wie oben erwähnt braucht das DataSet die Schema-Informationen, um die richtigen Tabellen, Datentypen etc. zu erzeugen. Das musst du mit einem Aufruf der extra dafür vorhandenen Methode dataSet.ReadXmlSchema(xmlSchemaFileName) tun, danach kannst du die XML-Datei mit dataSet.ReadXml(xmlFileName) einlesen.
Ein DataSet ist ein so genannter komplexer Datentyp; es kann viele Daten auf einmal verwalten. Du kannst mehrere Tabellen auf einmal darin haben, Relationen zwischen ihnen definieren und anderes mehr. Wenn du auf eine spezielle Tabelle darin zugreifen willst, kannst du sie über die Tables-Auflistung per Index oder, noch sicherer, per Name ansprechen; dies tut die Zeile
C#:
DataTable DT = dataset.Tables["Person"];
Eine solche Tabelle kannst du auch als DataSource für z.B. ein DataGridView verwenden, das dir dann automatisch die darin enthaltenen Sätze anzeigt; auch editieren kannst du sie damit.
Es ist übrigens empfehlenswert, der Übersichlichkeit halber dem DataSet einen anderen Namen zu geben als deiner Tabelle, z.B. "Adressbuch";
Wenn du einen Dateipfad mit einem String angeben willst hast du die Wahl, den String 'normal' anzugeben, wo du dann den Backslash '\' doppelt angeben musst (z.B. "C:\\Cyberdog\\irgendwas.xyz"), oder dem String einen Klammeraffen '@' voranstellst, damit du dir das Verdoppeln der Pfadtrenner ersparst (z.B. @"C:\Cyberdog\irgendwas.xyz"; dazu ist er nämlich da, beides zusammen geht nicht.
Hinsichtlich der ID ist zu überlegen, ob es für dich nicht besser ist, das Autoincrement zu nutzen. Eine DataColumn hat die Eigenschaften AutoIncrement (ermöglicht das automatische Vergeben und Erhöhen einer ID), AutoIncrementSeed (den Startwert für deine ID's) und AutoIncrementStep (um wieviel die ID jeweils erhöht werden soll); weitere Informationen findest du in der msdn-Library unter http://msdn.microsoft.com/de-de/library/system.data.datacolumn_members(VS.80).aspx. Unter Umständen ist es vielleicht auch nützlicher, den Datentyp GUID zu nutzen, aber darüber kannst du dir auch später noch Gedanken machen.
 
So ich habe nun mein Problem in den Griff bekommenund zwar so:

Code:
else
            {
                // Der Dateiname der XML-Datei
                string xmlFileName = (@"C:\Cyberdog\Eintragungen.xml");

                // DataSet erzeugen und XML-Datei mit Schema einlesen
                DataSet dataSet = new DataSet();
                try
                {
                    dataSet.ReadXml(xmlFileName, XmlReadMode.ReadSchema);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler beim Lesen der XML-Datei: " + ex.Message,
                       Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                // DataTable referenzieren
                DataTable personTable = dataSet.Tables["Person"];

                if (personTable == null)
                {
                    MessageBox.Show("Das XML-Dokument enthält keine person-Elemente",
                       Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                // Zeile anfügen
                personTable.Rows.Add(new Object[] { 
                    VornameFeld.Text, 
                    NachnameFeld.Text, 
                    NameKomplettFeld.Text, 
                    SpitznameFeld.Text, 
                    EmailFeld.Text, 
                    EmailFeldzwei.Text, 
                    TelefonHausFeld.Text, 
                    HandyFeld.Text, 
                    FaxFeld.Text, 
                    StraßeNormalFeld.Text}
                    );
                
                
                try
                {
                    xmlFileName = xmlFileName.Replace("Persons", "Persons_New");
                    dataSet.WriteXml(xmlFileName, XmlWriteMode.WriteSchema);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler beim Schreiben der XML-Datei: " + ex.Message,
                       Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                MessageBox.Show("Datensatz erfolgreich gespeichert.");
                this.Close();
            }
        }

Den Vorangegangenen Code phabe ich hier ja schon gepostet.
Mit der laufenden Nummer schaue ich mal ob ich es hinbekomme.

Hast du deine XML Kenntnisse aus dem Netz ?
Finde dort sind die Infos ein wenig rar.

Danke an alle Poster
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück