[C#] XML in Schleife auslesen, Wie?

Cyperfriend

Der ohne Avatar
Registriert
14 Juli 2013
Beiträge
1.123
Ich habe ein Übungsprogramm geschrieben um XML-Dateien lesen und schreiben zu können. Klappt soweit auch.
Nun möchte ich zwei Dinge im Programm ergänzen und erbitte eure Hilfe.
1) Wie kann ich alle Vornamen und Nachnamen aus der XML-Datei auslesen und im Dropdown anzeigen lassen?
2) Wie kann ich die Attribute Alter und Geschlecht zum gewählten Eintrag anzeigen lassen?

Zu 1). Ich weis, dass ich das Ganze mit einer foreach-Schleifen machen kann, aber mehr weis ich leider nicht, bzw. bin nicht weiter gekommen
Zu 2). Müsste ja irgendwie mit einer where-Abfrage gemacht werden, aber Google erweist sich nicht gerade als hilfreich.

[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace Laden_Speichern
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

string pfad = @"C:\_test\database.xml";
string geschlecht;

private void cmdEingabeSpeichern_Click(object sender, EventArgs e)
{
if(radioEingabeMaennlich.Checked)
{
geschlecht = "Männlich";
}
if (radioEingabeWeiblich.Checked)
{
geschlecht = "Weiblich";
}

if ((txtNachname.Text == "") || (txtVorname.Text == "") || (comboAlter.Text == ""))
{
toolStripStatus.Text = "Status: Fehler - Bitte alle Eingabefelder ausfüllen!";
}
else if (!File.Exists(pfad))
{
XmlTextWriter xWriter = new XmlTextWriter(pfad, Encoding.UTF8);
xWriter.Formatting = Formatting.Indented;
xWriter.WriteStartElement("People"); // <People>
xWriter.WriteStartElement("Person"); // <Person>
xWriter.WriteStartElement("Nachname"); // <Nachname>
xWriter.WriteString(txtVorname.Text); // Textbox Nachname
xWriter.WriteEndElement(); // </Nachname>
xWriter.WriteStartElement("Vorname"); // <Vorname>
xWriter.WriteString(txtNachname.Text); // Textbox Vorname
xWriter.WriteEndElement(); // </Vorname>
xWriter.WriteStartElement("Alter"); // <Alter>
xWriter.WriteString(comboAlter.Text); // ComboBox Alter
xWriter.WriteEndElement(); // </Alter>
xWriter.WriteStartElement("Geschlecht"); // <Geschlecht>
xWriter.WriteString(geschlecht); // Variable Geschlecht
xWriter.WriteEndElement(); // </Geschlecht>
xWriter.WriteEndElement(); // </Person>
xWriter.WriteEndElement(); // </People>
xWriter.Close();
toolStripStatus.Text = "Status: Datei erstellt, Eintrag gespeichert";
}
else
{
XmlDocument doc = new XmlDocument();
doc.Load(pfad);
XmlNode person = doc.CreateElement("Person");
XmlNode nachname = doc.CreateElement("Nachname");
nachname.InnerText = txtNachname.Text;
person.AppendChild(nachname);
XmlNode vorname = doc.CreateElement("Vorname");
vorname.InnerText = txtVorname.Text;
person.AppendChild(vorname);
XmlNode alter = doc.CreateElement("Alter");
alter.InnerText = comboAlter.Text;
person.AppendChild(alter);
XmlNode geschlecht1 = doc.CreateElement("Geschlecht");
geschlecht1.InnerText = geschlecht;
person.AppendChild(geschlecht1);
doc.DocumentElement.AppendChild(person);
doc.Save(pfad);
toolStripStatus.Text = "Status: Eintrag gespeichert";
}
}

private void Form1_Load(object sender, EventArgs e)
{
toolStripStatus.Text = "Status: Programm gestartet";

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "XML| *.xml";
if (ofd.ShowDialog() == DialogResult.OK);

XmlDocument xDoc = new XmlDocument();
xDoc.Load(ofd.FileName);

string nachname;
string vorname;

nachname = (xDoc.SelectSingleNode("People/Person/Nachname").InnerText);
vorname = (xDoc.SelectSingleNode("People/Person/Vorname").InnerText);
comboAuswahl.Items.Add(nachname + ", " + vorname);

lblAusgabeAlter.Text = "Alter: ";
}
}
}[/src]
Anhang anzeigen 42017
 
Wie ist den Deine Ansatz. Dynamisch die Daten auslesen oder erst die Datei komplett einlesen?
 
  • Thread Starter Thread Starter
  • #3
Also von der Logik her würde ich vorschlagen, dass man nur Vornamen und Nachnamen aus dem XML-File ausließt und anzeigen lässt (So wie es jetzt ist), aber die restlichen Attribute dann live abfragt, wenn sie gebraucht werden. Ich denke das Einlesen des XML-Files würde sonnst mit zunehmender Größe immer länger dauern. Bei meinem Miniprojekt (Eigentlich nur eine Übung) dürfte es aber keine große Rolle spielen.

Von daher würde ich sagen: Was einfacher umzusetzen ist. Gerade du weist ja was für ein Kampf ich mit der Programmierung führe. Würde es gerne können, scheitere aber regelmäßig.
 
@Cyperfriend

Rein von der Logik her würde man es vermutlich so lösen:
Einen Button (große Datei) oder wenn die Datei erwartend klein bleibt direkt beim Programmstart - einmal einlesen und das Dropdown befüllen.
Der Extra Button hat halt den Vorteil, man kommt in die Anwendung, selbst wenn die Datei riesig ist und der Ladevorgang 30 Sekunden dauern würde.

Und wenn die Liste schon geladen ist brauchst du ja nur das Dropdown Auswahlfeld mit dem zu letzt eingefügten Eintrag "erweitern", natürlich muß der dann geschrieben werden, aber du mußt dafür dann nicht auf die Datei lesend zugreifen weil du etwas "hinten anhängst".

Nur so als Idee, ich hab von C# keine Ahnung und kann daher beim coden absolut nicht helfen! ;)
 
Sry. Ich wollte schon am Nachmittag antworten, aber ging dann leider nicht.

@jimpsy hat recht, daß man bei Comboboxen mit Databinding arbeiten kann. machen wir aber jetzt mal nicht.

Ist das das Projekt von letztem Mai? Damals hatte ich Dir für schnelle Ergebnisse zu einem Dataset geraten.

Aber egal. Dann schauen wir mal wie Du mit foreach an Deine Daten kommst.

Nehmen wir als erstes einen Dropdown für die Namen.
Das sollte so funktionieren:

[src=csharp]
doc.Load("sample.xml");
xnList = doc.SelectNodes("/People/Person");
foreach (XmlNode note in xnList)
{
comboBox1.Items.Add(note.SelectSingleNode("Vorname").InnerText);
}
[/src]
 
Zurück
Oben