[C# .net Framework] In eine Textdatei schreiben / auslesen

Letztendlich ists doch egal ob die Beispiele für Konsolen oder Windows Forms Application geschrieben sind. Einzig die Ausgabe ändert sich. Solange es nur um den Zugriff auf Dateien, egal in welchem Format, geht bleibt alles identisch. Ich kann dir gerne einen Code schreiben der dir deine Daten in eine xml Datei schreibt und die dann in ne ComboBox läd, bringen wird dir das aber nichts. Versuch doch bitte mal einen Ansatz zu erstellen, ließ dich vorher ein (um Englisch kommst du eh nicht drum rum) und stell dann gezielt Fragen wo du Verständnis Probleme hast.
Andernfalls wird sich dein Programmieren in Zukunft wohl wahrscheinlich darauf beschränken hier nach 90% des Codes zu fragen welchen du dann zusammen kopierst. Nicht böse gemeint.

CSV würd ich hier nicht benutzen xml ist imo wesentlich flexibler. Wenn schon ein arbeiten dann gleich richtig.
 
CSV oder XML hängt von den Daten ab. So wie es hier aussieht gibt es keine komplezierten Daten, keine Verschachtelung .. und die Struktur der Daten lässt sich einfach in einer Tabelle speichern.

Außerdem musst du schauen womit Cyperfriend eher klar kommt. Er lernt erst wie man eine Datei ausließt. Eigene Klassen schreibt er wohl auch noch nicht usw. Also muss er erstmal die Grundlagen lernen, dann kann er mit XML-Dateien und -Objekten beginnen.

@Cyperfriend ich würde an deiner Stelle eine ArrayList verwenden in der man Personen Objekte ablegt. Ich gehe mal davon aus, dass dein speichern mom irgendwie so aussieht


[src=csharp]for(... ) {
sw.WriteLine(comboBox1.Items.Get(i)); // Namen schreiben
sw.WriteLine(comboBox2.Items.Get(i)); // Alter
sw.WriteLine(comboBox3.Items.Get(i)); // Geburtstag
sw.WriteLine(comboBox4.Items.Get(i)); // Abteilung
}[/src]

Was passiert den wenn die Daten so aussehen müssten. Also ein Feld nicht ausgefühlt wird

Max Mustermann1;22;Donnerstag, 28. August 2014;C28
;22;Donnerstag, 28. August 2014;C28
Maxi Musterfrau; ; ;C28

dann schreibst du ja

Max Mustermann1;22;Donnerstag, 28. August 2014;C28
Maxi Musterfrau ;22;Donnerstag, 28. August 2014;C28 <<-- Maxi Musterfrau rutscht eine Zeile hoch
// .. hier gibt es dann einen Fehler
 
  • Thread Starter Thread Starter
  • #23
So, ich habe dann mal ein XML-Dokument angelegt. Dank war das wirklich einfach.

So sieht der Code aus:
[src=csharp]
private void cmdSpeichern_Click(object sender, EventArgs e)
{
var Person = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("Beginn",
new XElement("ID", "1"),
new XElement("Person",
new XElement("Name", txtName.Text),
new XElement("Alter", combAlter.Text),
new XElement("Geburtsdatum", dateTimePicker1.Text),
new XElement("Bereich", txtBereich.Text)
)
)
);
Person.Save("C:\\_Transfer\\test.xml");
this.Close();
}[/src]

Die XML sieht so aus. Ich hoffe ihr seid damit zufrieden.
[src=xml]
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<Beginn>
<ID>1</ID>
-<Person>
<Name>Max Mustermann</Name>
<Alter>20</Alter>
<Geburtsdatum>Freitag, 29. August 2014</Geburtsdatum>
<Bereich>X22</Bereich>
</Person>
</Beginn>[/src]
(Irgendwie wird das im Forum nicht eingerückt, im Original ist es.)

Leider gibt es aber beim Laden der Datei einen Absturz, obwohl der Code als richtig angezeigt wird. Ich versuche hier jetzt den Namen aus der XML-Datei auszulesen und in die ComboBox zu übergeben.

[src=csharp]
string pfad = @"C:\_Transfer\test.xml";

if (File.Exists(pfad))
{
var Person = XElement.Load(pfad);

foreach (var p in Person.Elements())
comboBox1.Text = p.Element("Name").Value;
}
else
{
comboBox1.Text = "";
}[/src]

Dazu noch einige gezielte Fragen:

1) Was bedeutet das Schlüsselwort "var" und was genau macht die Zeile
[src=csharp]var p in Person.Elements()[/src]
2) Ich habe im XML-File bereits eine ID vorgesehen. Wie kann ich die XML-Datei nun erweitern und dabei automatisch eine ID einfügen, so wie ich das in MySQL gewohnt bin. Da passiert das automatisch. Auf der Seite wird ja grundsätzich gezeigt wie man das XML-File erweitert. Das will ich morgen ausprobieren.
 
wenn du var davor schreibst, dann bestimmt der Compiler für dich den Typen des Objektes p

muss die Zeile
comboBox1.Text = p.Element("Name").Value;

nicht so aussehen ?
comboBox1.Items.Add(p.Element("Name").Value);

ohne eine Fehlermeldung kann man schlecht sagen, wieso dein Programm abstürtzt.

zu 2. du muss deine Schreib-Methode neu schreiben


Einfaches Beispiel um eine Person zu speichern
[src=csharp] XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes") );
XElement person = new XElement("Person",
new XElement("ID", "1").
new XElement("Name", txtName.Text),
new XElement("Alter", combAlter.Text),
new XElement("Geburtsdatum", dateTimePicker1.Text),
new XElement("Bereich", txtBereich.Text)
);
doc.Root.Add(person);
doc.Save("C:\\_Transfer\\test.xml");
this.Close();[/src]

nun hier um mehrere zu speichern:

[src=csharp]

XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes") );
XElement person:
for(int i = 0; ... ; i++) {
person = new XElement("Person",
new XElement("ID", i). // <-- i
new XElement("Name", txtName.Text), //die zeilen musst du natürlich auch noch anpassen
new XElement("Alter", combAlter.Text),
new XElement("Geburtsdatum", dateTimePicker1.Text),
new XElement("Bereich", txtBereich.Text)
);
doc.Root.Add(person);
}
doc.Save("C:\\_Transfer\\test.xml");
this.Close();[/src]


PS deine XML Datei ist nicht ganz richitg; ID und Begin habe ich oben geändert. So müsste es aussehen:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<Person>
<ID>1</ID>
<Name>Max Mustermann</Name>
<Alter>20</Alter>
<Geburtsdatum>Freitag, 29. August 2014</Geburtsdatum>
<Bereich>X22</Bereich>
</Person>
 
  • Thread Starter Thread Starter
  • #26
Ich habe mal ein komplett neues Projekt gestartet, wo es nur um die Verarbeitung mit XML-Dokumenten gehen soll.

Ich habe als erstes das einfache Beispiel von War-10-ck nachgebaut, aber in der Zeile
[src=csharp]doc.Root.Add(person);[/src] gibt es einen Fehler, wenn man speichern will. (Siehe Anhang)
Ich habe das Projekt mal kommentiert. Stimmt das so oder gibt es Einwände?
[src=csharp]
public formStart()
{
InitializeComponent();

// Dateipfad festlegen
string pfad = @"C:\_Transfer\beispiel.xml";

// Prüfen, ob die angeforderte Datei existiert
if (File.Exists(pfad))
{
comboName.Text = "Datei gefunden";
}
else
{
comboName.Text = "Keine Datei";
}
}

private void XMLSchreiben_Click(object sender, EventArgs e)
{
// Dateipfad festlegen
string pfad = @"C:\_Transfer\beispiel.xml";

// XML-Dokument einleiten
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes")
);

// XML-Struktur erzeugen und mit Inhalt füllen
XElement person = new XElement("Person",
new XElement("ID", "1"),
new XElement("Name", txtName.Text),
new XElement("Alter", comboAlter.Text)
);

// Keine Ahnung
doc.Root.Add(person);

// XML-Dokument speichern
doc.Save(pfad);

// Form schließen
this.Close();
}
[/src]

Anhang anzeigen 25500

Nachtrag: Selbst wenn man die Zeile auskommentiert gibt es einen Fehler, weil angeblich kein XML-Konformes Dokument entstehen würde.
 
Zuletzt bearbeitet:
Du versuchst person als Untergeordnetes Element einem nicht existierenden Root-Element des Documents hinzuzufügen. Daher die Exception.
 
  • Thread Starter Thread Starter
  • #28
Ähm ... verstehe ich nicht. Das Dokument soll doch (sofern nicht vorhanden) erstellt werden.
Kannst du mir das bitte genauer erklären. Ich glaube ich verstehe die aussage / Logik nicht.
 
Das Dokument erstellst Du.

Wenn Du diesem direkt per Add Dein person hinzufügen würdest, dann gäbe es keine Exception an dieser Stelle.

Du fügst person aber dem Rootelement von Dokument hinzu, welches Du noch gar nicht definiert hast
 
Zurück
Oben