Laden...

XML-File auslesen

Erstellt von chrome21 vor 15 Jahren Letzter Beitrag vor 15 Jahren 25.033 Views
C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren
XML-File auslesen

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.

239 Beiträge seit 2008
vor 15 Jahren

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]

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

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();
C
89 Beiträge seit 2005
vor 15 Jahren

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.

J
222 Beiträge seit 2006
vor 15 Jahren

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

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

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?

699 Beiträge seit 2007
vor 15 Jahren

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

365 Beiträge seit 2007
vor 15 Jahren

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

S
25 Beiträge seit 2007
vor 15 Jahren

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

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

 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";
           
        }
365 Beiträge seit 2007
vor 15 Jahren

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 ....

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

Nein das war nur ein test. Sorry hat den testcode noch drin.
Natürlich heisst es richtig

txtKunde.Text = datum;
365 Beiträge seit 2007
vor 15 Jahren

Hehe .....
Und funzt der Code bei dir?!

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

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.

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

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?

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

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.

365 Beiträge seit 2007
vor 15 Jahren

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 .....
3.971 Beiträge seit 2006
vor 15 Jahren

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...

365 Beiträge seit 2007
vor 15 Jahren

damit es nicht langweilig wird. hehe ....){gray}

C
chrome21 Themenstarter:in
13 Beiträge seit 2009
vor 15 Jahren

Keine Ahnung wieso das so war. Aber vielen Dank an allen Postern für die schnelle und kompetente Hilfe. Das hier ist ein Superforum 👍

S
25 Beiträge seit 2007
vor 15 Jahren

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