Autor |
Beitrag |
AeroX
      
Beiträge: 68
|
Verfasst: So 02.03.08 22:58
ich versuche es jetzt schon seit 2 oder 3 stunden!
diese verdammten XML-Dateien!
also, ich möchte gerne eine liste von den attributen und dem inhalt machen!
XML-Daten 1: 2: 3: 4: 5: 6: 7:
| <?xml version="1.0" encoding="utf-8"?> <Termine> <Termin id="08.05.2008"> <child time="12:00">Das ist der erste Termin!</child> <child time="14:00">Das ist der zweite Termin!</child> </Termin> </Termine> |
das programm sollte jetzt nach der id suchen,
und dann jeden child auflisten!
also so:
Das ist der erste Termin! 12:00
Das ist der zweite Termin! 14:00
Moderiert von Christian S.: Code- durch XML-Tags ersetzt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 02.03.08 22:59
Wenn Du es schon Stunden versuchst, hast Du doch bestimmt einen Ansatz, mit dem man arbeiten kann. Also zeig mal her 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: So 02.03.08 23:10
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| XmlDocument doc = new XmlDocument(); doc.Load("Config.xml"); XmlElement document = doc.DocumentElement; XmlElement XMLTermin = doc.GetElementById("08.05.2008"); foreach (XmlNode @daten in XMLTermin.ChildNodes) { listBox1.Items.Add(@daten.InnerText); listBox2.Items.Add(@daten.Attributes["time"]); } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 02.03.08 23:23
Hallo!
GetElementById dürfte nur dann funktionieren, wenn in der XML-Datei auch ein Attribut als ID festgelegt wurde. (Siehe Doku zu GetElementById-Methode, da steht's erklärt). Der Name reicht dafür wohl nicht.
Ich arbeite kaum mit dem XML-Klassen, weil ich immer nur über den XMLSerializer ganze Instanzen von Klassen lese, aber der direkteste Weg dürfte sein, selber die Kind-Knoten durchzulaufen und zu schauen, bei wem das Attribut richtig ist.
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: Mo 03.03.08 14:57
Also bei mir steht, das eine Objektinstanz fehlt in der Zeile,
wo foreach steht!
was soll ich tun?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 03.03.08 15:00
AeroX hat folgendes geschrieben: | was soll ich tun? |
Lese, was ich geschrieben habe.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: Mo 03.03.08 15:24
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 03.03.08 15:39
AeroX hat folgendes geschrieben: | Wo is denn diese Doku? |
Cursor auf GetElementById =>  .
Für einen Anfänger vielleicht nicht gerade geeignet, aber hier noch zwei andere Wege, die mir gerade einfallen. Manchmal ist es wirklich schrecklich mit dem Framework, da sind selbst die Wege nach Rom noch übersichtlicher  .
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var doc = new XPathDocument("File.xml"); foreach (XPathNavigator navigator in doc.CreateNavigator().Select("/Termine/Termin[@id=\"08.05.2008\"]/child")) Console.WriteLine(navigator.InnerXml + navigator.GetAttribute("time", ""));
foreach (var child in XElement.Load("File.xml") .Elements("Termin") .Single(termin => termin.Attribute("id").Value == "08.05.2008") .Elements("child")) Console.WriteLine(child.Value + child.Attribute("time").Value); |
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: Mo 03.03.08 17:10
danke dir für die anderen Varianten!
ich habe jtzt ein Code, aber thoretisch darf er das element doch garnicht finden!
oder?
C#-Quelltext 1: 2: 3:
| var doc = new System.Xml.XPath.XPathDocument("Config.xml"); System.Xml.XPath.XPathNodeIterator navigator = doc.CreateNavigator().Select("/Termine/Termin[@id=\"NICHT_DAS_DATUM\"]/child"); MessageBox.Show(navigator.Current.ToString()); |
Es kommt jetzt trotzdem dem der Inhalt!
(man achte auf die ID!)
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 03.03.08 21:25
Wenn ich das in der Doku richtig lese, musst Du nach dem Aufruf von Select bei dem zurückgegebenen Iterator erst einmal MoveNext() aufrufen und schauen, ob das Ergebnis true ist. Falls ja, kannst Du Current auswerten. Rufst Du MoveNext() nicht auf, wird Current mutmaßlich auf den ersten Datensatz zeigen, egal ob der passt oder nicht.
Aber vorischt: Ich hab's nicht ausprobiert, aber die Beispiele in der Doku lassen mich das vermuten.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: Mo 03.03.08 23:31
Jo,
hat geklappt!
nun habe ich aber das problem,
dass die foreach-schleife nicht mehr funzt!
hier mal der gesamte Code:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| try { var doc = new System.Xml.XPath.XPathDocument("Config.xml"); System.Xml.XPath.XPathNodeIterator navigator = doc.CreateNavigator().Select("/Termine/Termin[@id=\"08.05.2008\"]/child"); if (navigator.MoveNext()) { foreach (System.Xml.XPath.XPathNavigator navi in navigator) { MessageBox.Show(navi.InnerXml + navi.GetAttribute("time", "")); } } else { MessageBox.Show("Noch kein Eintrag!"); } } catch (Exception error) { MessageBox.Show("Fehler aufgetreten:\n\n" + error.ToString()); } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 04.03.08 14:46
Wenn du foreach benutzt, ist MoveNext natürlich fehl am Platze - wie in meinem Beispiel oben hoffentlich erkenntlich ;P .
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: Di 04.03.08 16:53
und wie soll ich das jetzt machen?
|
|
AeroX 
      
Beiträge: 68
|
Verfasst: Di 04.03.08 19:50
ok, ich habs jetzt gelöst!
hier nochmal für alle die das gleiche Problem haben:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| try { var doc = new System.Xml.XPath.XPathDocument("Config.xml"); System.Xml.XPath.XPathNodeIterator navigator = doc.CreateNavigator().Select("/Termine/Termin[@id=\"08.05.2008\"]/child"); string[] XmlTermins = new string[10]; string[] XmlTimes = new string[10]; int i = 0; while (navigator.MoveNext()) { XmlTermins[i] = navigator.Current.Value; XmlTimes[i] = navigator.Current.GetAttribute("time",""); i++; } if (XmlTermins.Length != XmlTimes.Length) MessageBox.Show("Daten stimmen nicht überein!"); if (i == 0) { listBox1.Items.Add("Keine Termine Vorhanden!"); } else { for (int fi = 0; fi < i ; fi++ ) { listBox1.Items.Add(XmlTermins[fi]); listBox2.Items.Add(XmlTimes[fi]); } }
} catch (Exception error) { MessageBox.Show("Fehler aufgetreten:\n\n" + error.ToString()); } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
US_Navy
Hält's aus hier
Beiträge: 2
|
Verfasst: Fr 08.01.10 19:48
Hallo,
Ich bräuchte mal eure Hilfe, und zwar möchte ich gerne dieses XML auslesen, kriege es aber leider nicht hin.
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| <?xml version="1.0" encoding="utf-8"?> <movies> <id movie shown="false"> <id moviedb="allocine">"387892"</id> <id moviedb="filmweb">"387892"</id> <filenameandpath></filenameandpath> <trailer></trailer> <genre></genre> <credits></credits> </id movie> </movies> |
Hier möchte ich nur die beiden Zeilen <id moviedb> auslesen. Beide Zeilen sollten in einer Datenbank in ein Seperates Feld geschrieben werden. (Diese Anbingung habe ich schon). Nur eben das auslesen bekomme ich nicht hin.
Grüße Oliver
|
|
US_Navy
Hält's aus hier
Beiträge: 2
|
Verfasst: Sa 09.01.10 11:45
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Sa 09.01.10 12:11
US_Navy hat folgendes geschrieben : | Habe das Problem nun doch noch lösen können! |
Statt dass du deine Frage kopierst und vollständig zitierst, sodass sie zweimal hintereinander steht, wäre es für andere Forumsnutzer erheblich hilfreicher, wenn du deine Lösung angeben würdest. Ist es so schwierig, an andere Leser zu denken? Jürgen
|
|