foreach schleife für xml auswertung
-
Ich lerne erst seit kurzem C#, und komme mit der auswertung einer größeren xml datei nicht zurecht.
der betreffende xml bereich sieht in etwas so aus:<def> <ship id "...."> <shiptype>abc</shiptype> ... </ship> <ship id "...."> <shiptype>xyz</shiptype> ... </ship> </def>
Dieser ship knoten kommt beliebig oft in der datei vor.
Meine (vorläufige) auswertung sieht derzeit so aus:
public static void schiffe(string thedat) { XmlDocument doc = new XmlDocument(); doc.Load("kbs/" + thedat); XmlNodeList nodelist; XmlElement wurzel = doc.DocumentElement; nodelist = wurzel.SelectNodes("//after//defender//ship"); XmlNode typ; foreach(XmlNode ships in nodelist) { typ = ships.SelectSingleNode("//shipType"); Console.WriteLine("SchiffTyp: " + typ.InnerXml); } }
KOmischerweiße holt der sich die typ variable, nur beim 1. durchlauf, und bei allen anderen ist der inhalt von typ genau wie beim ersten, auch wenn da was ganz andres in der xml datei drinsteht. Hab ich da was vergessen?
Danke schonmal.
-
nodelist = wurzel.SelectNodes("//after//defender//ship")
Aber du hast hier schon den ersten "ship" ausgewählt - man kann nicht innerhalb dieses Knotens auf weitere "ships" zugreifen. "nodelist" sollte dann "defender" enthalten.
http://www.aspheute.com/artikel/20001117.htm - schau mal hier, mir scheint das Style der Abfrage der eibzelnen Elemente besser zu sein.
-
Das XML ist fehlerhaft. Attribute und deren Werte gehören mit einem Gleichheitszeichen verbunden.
-
Jo hast recht, ist aber in der xml datei richtig. Ich hab nur die struktur grob abgetippt, und mich vertan.
Ich versuch mal ob vadimiron'S lösung funktioniert.
-
Also ich hab da nochn problem mit der lösung:
Diese ship knoten sind ziemlich weit hinten verschachtelt, und ein zugriff ist nur über xpath möglich aufgrund der struktur.
Wie kann ich diese Lösung trotzdem verwenden?Meine derzeitige schleife sieht jetzt so aus, funktioniert so aber nicht:
foreach (XmlNode ship in thewurzel.ChildNodes) { if (ship["shipType"] != null) { thetyp = ship["shipType"].InnerText; Console.WriteLine("SchiffTyp: " + thetyp); str += "Schiff: " + thetyp + Environment.NewLine; } }
Ich hab halt nicht den richtigen knoten selectiert, wie kann ich das (am besten xpath) machen?
Danke nochmal.