• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C#] Fragen zu XML

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
Ich habe meine Fragen kurzerhand in den Quellcode geschrieben. Ich denke das macht in der Situation am meisten Sinn und hoffe auf hilfreiche Antworten.
Anhang anzeigen 35091
[src=csharp]
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;

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

// Pfad an dem die Datei gespeichert werden soll
string pfad = "C:\\XML\\personen.xml";

private void cmdSpeichern_Click(object sender, EventArgs e)
{
if((txtNachname.Text == "") || (txtVorname.Text == ""))
{
MessageBox.Show("Bitte alle Felder ausfüllen");
}
else if (!File.Exists(pfad))
{
XDocument xmlDocument = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XComment(" Root "),
new XElement("Personen",
new XElement("Person", new XAttribute("id", 101),
new XElement("Nachname", txtNachname.Text),
new XElement("Vorname", txtVorname.Text),
new XElement("Alter", numericUpDown1.Text))));
xmlDocument.Save(pfad);
MessageBox.Show("Datei erstellt.\nGespeichert.");
}
else
{
// Wie kann ich weitere Einträge in die XML-Datei hinzufügen?
// Wie zähle ich die ID hoch?
MessageBox.Show("Und nun?");
}
}

private void Form1_Load(object sender, EventArgs e)
{
XDocument xmlDocument = XDocument.Load(pfad);

var nachname = from Person in xmlDocument.Root.Elements()
orderby Person.Element("Nachname").Value
select Person.Element("Nachname").Value;

foreach (var tmp in nachname)
{
// Und wie bekome ich den Vornamen jetzt da rein?
comboBox1.Items.Add(tmp);
}
}

private void comboBox1_Change(object sender, EventArgs e)
{
// Wie greife ich auf die XML-Datei zu um den passenden Eintrag auszulesen und wie mache ich das dann überhaupt?
// lblAlter2.Text =
}
}
}
[/src]
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #2
So, ich habe ein Problem teilweise gelöst bekommen, aber so ganz glücklich bin ich nicht.

[src=csharp]
private void comboBox1_Change(object sender, EventArgs e)
{
XDocument xmlDocument = XDocument.Load(pfad);

var alter = (from Personen in xmlDocument.Descendants("Person")
where Personen.Element("Nachname").Value == comboBox1.Text
select Personen.Element("Alter").Value);

foreach(string temp in alter)
{
lblAlter2.Text = "Alter: " + temp + " Jahre";
}
}
[/src]

Damit kann ich jetzt ein Eintrag auslesen, aber die XML sieht jetzt so aus:

[src=xml]
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Root -->
<Personen>
<Person>
<Nachname>Musterfrau</Nachname>
<Vorname>Maxi</Vorname>
<Alter>33</Alter>
<Geschlecht>weiblich</Geschlecht>
<Beruf>Bürofrau</Beruf>
</Person>
<Person>
<Nachname>Mustermann</Nachname>
<Vorname>Max</Vorname>
<Alter>20</Alter>
<Geschlecht>männlich</Geschlecht>
<Beruf>Bauarbeiter</Beruf>
</Person>
</Personen>
[/src]

Ich kann doch nicht für jeden Eintrag jetzt so viel Code schreiben um den jeweiligen Punkt auszulesen. Man stelle sich vor die Datei enthielte 20 oder noch mehr Punkte. Gibt es da keine intelligentere Lösung?

Für die anderen Probleme konnte ich ebenfalls noch keine Lösung finden und bin für Hilfe dankbar.
 

virtus

Gehasst

Registriert
24 Apr. 2015
Beiträge
1.689
Ort
AUF DEM MOND
Zuerstmal solltest du dir die Dokumentation zu der verwendeten Bibliothek anschauen, wahrscheinlich werden dir da einige Funktionalitäten mitgegeben.
Außerdem solltest du dir vielleicht eine Funktion schreiben, die das XML Dokument und den Feldnamen als Parameter bekommt und den Feldwert zurück liefert.
Dann bräuchtest du immer nur diese Funktion zu nutzen
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #4
Danke für deine Antwort,

leider scheinen die ganzen Leute grad im Urlaub zu sein die mich kennen. Das Problem bei mir ist, dass ich wahnsinnige Probleme mit dem abstrakten und "logischen" Denken habe. Bei mir muss der Code also echt einfach gehalten werden. Funktionen haben da bislang meist den Rahmen gesprengt. Bei mir ist es auch nicht Ziel das möglichst professionell und mit wenig Code zu lösen, sondern man ist froh, wenn ich überhaupt erstmal was funktionierendes zustande bringe. Klar könnte ich mir jetzt zum Auslesen immer den Code aus Beitrag #2 nehmen, aber das ist selbst mir zu doof. Gibt es da wirklich keine vernünftige Lösung zu? In PHP/MySQL macht man eine einfache Abfrage mittels "select * from A where X=Y" und hat dann Zugriff auf die komplette Tabelle der Datenbank. Sowas muss es doch auch für C# / XML geben?

Wenn man mit Google sucht findet man meist Ergebnisse von der Microsoft Developer Seite, aber ich komme mit den dort genannten Beispielen und Erklärungen nicht klar.

Eine Erklärung wie ich mittels Texteingaben zusätzliche Einträge in die XML machen kann habe ich auch noch gar nicht gefunden. Was ich finde sind statische Beispiele. Ja super, damit kann ich nichts anfangen. Eine statische XML zu erstellen ist nun echt kein Kunstwerk, dafür würde ich netmal eine Programmiersprache benutzen, sondern das gleich von Hand machen.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
So, ich habe ein Problem teilweise gelöst bekommen, aber so ganz glücklich bin ich nicht.

Damit kann ich jetzt ein Eintrag auslesen, aber die XML [...]

Ich kann doch nicht für jeden Eintrag jetzt so viel Code schreiben um den jeweiligen Punkt auszulesen. Man stelle sich vor die Datei enthielte 20 oder noch mehr Punkte. Gibt es da keine intelligentere Lösung?

Genau aus diesem Grund aber schreibt man sich Funktionien, um etwas nur einmal (funktionstüchtig und mit richtigen Ergebnis) zu machen und immer wieder darauf zurückzugreifen.

Ich bin jetzt kein CSharp Experte, aber im Grunde mußt du es nur so machen (kann Fehler enthalten, es geht um den Sinn eine Funktion zu nutzen!)
[src=csharp]

// Diese Funktion macht immer die Arbeit
private string xmlWertholen(string pfad, string suchName, string suchWert )
{
XDocument xmlDocument = XDocument.Load(pfad);

var alter = (from Personen in xmlDocument.Descendants("Person")
where Personen.Element("Nachname").Value == suchName
select Personen.Element(suchWert).Value);

foreach(string temp in alter)
{
return temp;
}
return "";
}

// Dieser Code wiederholt sich
lblAlter2.Text = xmlWertholen("meineXML.xml", comboBox1.Text, "Alter");

// Oder wenn du den Vornamen holen willst
string vorname = xmlWertholen("meineXML.xml", comboBox1.Text, "Vorname");

// Oder wenn du den Beruf holen willst
string beruf = xmlWertholen("meineXML.xml", comboBox1.Text, "Beruf");
[/src]
 
Zuletzt bearbeitet:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Wenn es wirklich nur darum geht, Deine Form schnell und einfach mit einer XML-Datei zu verknüpfen, nicht um XML zu verstehen, dann nimm ein Dataset.

1) Dataset dem Projekt hinzufügen und dann im Deigner:
2) Spalte ID
2a) Bei Eigenschaften Autincrement auf true setzen
2b) Key hinzufügen und die Spalte ID als Primary Key auswählen
3) Soalte Vorname
4) Spalte Nachname
5) Spalte Alter
6) Instanzieren des Datasets irgendwo/oben in der Klasse: DataSet1 ds = new DataSet1();

[src=csharp] private void cmdSpeichern_Click(object sender, EventArgs e)
{
DataRow dr = ds.DataTable1.NewDataTable1Row();
dr["Vorname"] = txtVorname.Text;
dr["Nachname"] = txtNachname.Text;
dr["Alter"] = txtAlter.Text;
ds.DataTable1.Rows.Add(dr);
if (!Directory.Exists(@"C:\XML"))
{
Directory.CreateDirectory(@"C:\XML");
}
ds.DataTable1.WriteXml(@"C:\XML\personen.xml");
}


private void Form1_Load(object sender, EventArgs e)
{
if (File.Exists("C:\\XML\\personen.xml"))
{
ds.DataTable1.ReadXml("C:\\XML\\personen.xml");
comboBox1.DataSource = ds.DataTable1;
comboBox1.DisplayMember = ds.DataTable1.NachnameColumn.ColumnName;
comboBox1.ValueMember = ds.DataTable1.AlterColumn.ColumnName;
}
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
lblAlter2.Text = comboBox1.SelectedValue.ToString();
}[/src]

Das sollte so funktionieren.

Das ist natürlich nicht alles.Beim Speichern müssen jetzt die Felder wieder gelehrt werden, die Daten sind auch nicht automatisch in der Combobox etc.
Wenn Du Vor und Nachnamen zusammen in der Combox haben möchtest (?), dann geht das so nicht mit Databinding.
 
Oben