verwendetes Datenbanksystem: <XML>
Hallo zusammen,
ich bin c# Anfänger und hänge schon seite Stunden an einem Problem. Ich habe auch das Forum hier durchforst aber es klappt einfach nicht.
Ich möchte einige Werte aus einer XML-Datei auslesen. Und diese jeweils in eine Textbox schreiben.
Dies habe ich ausprobiert:
XmlReader Reader = XmlReader.Create("preisliste.xml");
Reader.ReadStartElement("Settings");
Reader.ReadStartElement("Datum");
txtDatum.Text = Reader.ReadString();
Reader.ReadEndElement();
Reader.Close();
Das sollte erstmal als test sein. Hier soll das Datum ausgelesen werden.
Aber er macht gar nichts. Die Textbox bleibt leer. Ich bekomme auch keine Fehlermeldung oder so.
Die Passende XML-Datei sieht so aus:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<Datum>Januar 2009</Datum>
<Brot>4</Brot>
<Wasser>5</Wasser>
<Milch>3</Milch>
<Butter>2</Butter>
</settings>
Es wäre Nett wenn mir jemand einen Tipp geben könnte.
Du hältst dich ja ganz gut an das entsprechende Beispiel aus der MSDN. Allerdings fehlt bei dir ein kleiner Teil, den du ausprobieren solltest (es gibt zwar mehrere Möglichkeiten eine XML-Datei auszulesen, aber um bei deinem Beispiel zu bleiben):
XmlReader Reader = XmlReader.Create("preisliste.xml");
reader.Read(); // <- das fehlt bei dir...
...
Mit Read() liest du den nächsten Knoten ein, somit hast du dann Zugriff auf die Elemente die darunter liegen.
Neulich im Computerkurs:
Mein Computer kennt Else nicht! 😁
[URL]XING-Profil[/URL]
Hallo,
danke für den Hinweis leider ist es aber genau wie vorher. Er liest nichts ein:
Habe den Code jetzt so:
XmlReader Reader = XmlReader.Create("preisliste.xml");
Reader.Read();
Reader.ReadStartElement("settings");
Reader.ReadStartElement("Datum");
txtKunde.Text = Reader.ReadString();
Reader.ReadEndElement();
Reader.Close();
Also ich würde vorschlagen das ganze via xPath zu lösen. Ein bisschen Theorie hier: http://www.w3schools.com/XPath/default.asp
Und so verwendest Du das Ganze in C#:
XmlDocument doc = new XmlDocument();
doc.Load("preisliste.xml");
XmlNode node = doc.SelectSingleNode("/settings/Datum");
string datum = node.FirstChild.Value;
und evtl. noch prüfen, ob FirstChild == null.
wenn du Linqerwenden kannst (net 3.5 )
string strTest = null;
XDocument xml = XDocument.Load("hier pfad zum xml");
var xmlQuery = from item in xml.Descendants("settings")
select item;
foreach (XElement items in xmlQuery)
{
Console.WriteLine(items.Element("Datum"));
Console.WriteLine(items.Element("Brot"));
Console.WriteLine(items.Element("Wasser"));
Console.WriteLine(items.Element("Milch"));
Console.WriteLine(items.Element("Butter"));
}
Console.ReadLine();
hoffe das hilft dir so kann man xml daten sehr einfach und schnell auslesen
Mir scheint als hängt es an irgendetwas anderem:
Ich habe es ausprobiert, aber das Ergebnis bleibt das selbe.
Habe dann zum Testen mal folgendes geschrieben:
XmlDocument doc = new XmlDocument();
doc.Load("preisliste.xml");
XmlNode node = doc.SelectSingleNode("/settings/Datum");
string datum = node.FirstChild.Value;
txtKunde.Text = "datum";
Er müßte mir jetzt wenigsten das Wort "datum" ausgeben. Aber das Feld bleibt leer!
Ich habe das alles in der private void Form1_Load kann es daran liegen?
@Jabi
Wer oder was ist Linq?
Hallo,
ich bin zwar selber noch nicht ein Profi unter C#, aber rein logisch gesehen (nicht getestet) machst Du einen kleinen Fehler.
XmlReader Reader = XmlReader.Create("preisliste.xml");
Reader.Read();
Reader.ReadStartElement("settings");
Reader.ReadStartElement("Datum");
txtKunde.Text = Reader.ReadString();
Reader.ReadEndElement();
Reader.Close();
Du versuchst mit Reader.Read(); ein Element zu lesen, bevor Du dem Reader sagst was er denn lesen soll.
Versuche das mal andersrum.
Grüße Stephan
Hallo chrome21,
so wie es für mich aussieht sprichst du einfach das Xml - File falsch an.
Du hast keine FileNotFoundexception, also ist deine Datei physisch vorhanden.
Poste doch einfach mal einen Auschnitt aus deiner Xml - Datei,
vielleicht kann dir dann hier jemand besser, oder genauer helfen .....
Greetz da kubi .....
P.S.:
Themen zu LINQ sind haufenweise im Netz zu finden,
bitte bemüh dich ein wenig mit Selbstinitiative ..... 😉
Links zum Thema :LINQ Wikipedia
LINQ MSDN
LINQ Visual C# 2008 Galileo Computing
Guten Abend chrome21,
Ich habe das alles in der private void Form1_Load kann es daran liegen?
Nein eigentlich nicht. Poste doch mal die relevanten Teile deines Quellcodes. Dann kann dir wahrscheinlich auch geholfen werden.
Poste doch einfach mal einen Auschnitt aus deiner Xml - Datei...
Bereits geschehen, siehe erster Post:
Die Passende XML-Datei sieht so aus:
<?xml version="1.0" encoding="utf-8" ?> <settings> <Datum>Januar 2009</Datum> <Brot>4</Brot> <Wasser>5</Wasser> <Milch>3</Milch> <Butter>2</Butter> </settings>
Gruß Simon
Mache die Dinge so einfach wie möglich - aber nicht einfacher.
Albert Einstein
private void Form1_Load(object sender, EventArgs e)
{
lblPreis.Text = "Klicken Sie auf `Kalkulieren`";
// Preise aus XML-Datei lesen
/* XmlReader Reader = XmlReader.Create("preisliste.xml");
Reader.Read();
Reader.ReadStartElement("settings");
Reader.ReadStartElement("Datum");
txtKunde.Text = Reader.ReadString();
Reader.ReadEndElement();
Reader.Close();*/ Dieser Code geht nicht
//Dieser Code anscheinend auch nicht
XmlDocument doc = new XmlDocument();
doc.Load("preisliste.xml");
XmlNode node = doc.SelectSingleNode("/settings/Datum");
string datum = node.FirstChild.Value;
txtKunde.Text = "datum";
}
XmlDocument doc = new XmlDocument();
doc.Load("file.xml");
XmlNode node = doc.SelectSingleNode("/settings/Datum");
txtKunde.Text = node.InnerText;
Sollte das nächste mal wieder genauer lesen bevor Ich was poste 😁
Bezug auf poste mal ein Ausschnitt deines Xml - Files .....
P.S.:
Darf Ich mal fragen was der nächste Code - Ausschnitt soll?!
string datum = node.FirstChild.Value;
txtKunde.Text = "datum";
Verwendest du string datum weiter?!
Oder soll die Zuweisung = "datum" auf deinen string datum beziehen.
Das wird so nämlich nicht klappen ....
Nein das war nur ein test. Sorry hat den testcode noch drin.
Natürlich heisst es richtig
txtKunde.Text = datum;
Nein leider nicht.
XmlDocument doc = new XmlDocument();
doc.Load("preisliste.xml");
XmlNode node = doc.SelectSingleNode("/settings/Datum");
txtKunde.Text = node.InnerText;
label5.Text = "Blablubb";
Das komische ist das das Programm irgendwie "stehenbleibt". Er müßte bei Label5 ja auch den "Blablubb-Text" schreiben, was er aber nicht macht.
Und txtKunde.text kann ich auch hinschreiben was ich will, er macht es nicht.
Irgendwie glaube ich den Fehler langsam einzukreisen.
Ich habe einfaach mal den Dateinamen der XML-Datei geändert und er hat exakt das selbe gemacht. Obwohl es die Datei nicht gibt.
Das heißt also das er warscheinlich das File nicht findet oder so. Aber wieso kommt dann keine Fehlermeldung?
OH man die Datei hatte ein e zuviel im Dateinamen. Ich könnte mich selbst in den Allerwertesten treten.
Jetzt klappt es natürlich.
Aber wieso keine Fehlermeldung kam weil er die Datei nicht gefunden hat ist mir schleierhaft.
8o Das ist wirklich ungewöhnlich ..... 🤔
Leider übersteigt das meinen Horizont an Erfahrung .....
Mir ist kein Fall bekannt, das .NET eine Datei lädt die physisch nicht vorhanden ist
und keine Fehlermeldung aka FileNotFounException wirft ....
Bleibt nur zu hoffen das einer unserer myCSharp - Member den nötigen
Anhaltspunkt dazu liefert ......
Versuch doch einfach mal vorher:
using System.IO;
if(File.Exist("preisliste.xml")
{
// tu etwas
}
else
{
MessageBox.Show("Datei nicht gefunden....");
}
Greetz da kubi ...
Edit:
Na dann hat sich das Prob ja gelöst, was aber immer noch nicht
das überspringen der Exception erklärt .....
Mir ist kein Fall bekannt, das .NET eine Datei lädt die physisch nicht vorhanden ist
Doch die Datei existiert, eventuell liegt oder lag ein falsche Datei im aktuellen (Ausgabeverzeichnis) und FileStream hatte dann diese geöffnet.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Keine Ahnung wieso das so war. Aber vielen Dank an allen Postern für die schnelle und kompetente Hilfe. Das hier ist ein Superforum 👍
Gutem Abend chrome21,
das nächste Mal kommst du dem Fehler mit einem Haltepunkt in Verbindung mit dem Überwachnugsfenster wahrscheinlich schneller auf die Schliche. 😉
Denn dafür ist es ja da.
Gruß Simon
Mache die Dinge so einfach wie möglich - aber nicht einfacher.
Albert Einstein