Problem mit LINQ to XML
-
Hallo zusammen,
ich habe zur zeit das Problem das folgender select :
ar skills = from c in doc.Elements("Skilllist").Elements("Category") where Convert.ToString(c.Element("Id").Value) == categoryname select c.Element("Skills").Element("Skill").Element("Name").Value;
lediglich ein einzelnes Ergebnis zurück liefert, obwohl die zugehörige Datei am selbiger stelle mehrere Daten enthält.
</Category> <Category> <Id>Armor-Light</Id> <Type>standard</Type> <Stat1>St</Stat1> <Stat2>Ag</Stat2> <Stat3>St</Stat3> <Skills> <Skill> <Name>Soft Leather</Name> <Desc>Skill required for movement maneuvers in soft leather armor (AT 5-8).</Desc> </Skill> <Skill> <Name>Rigid Leather</Name> <Desc>Skill required for movement maneuvers in rigid leather armor (AT 9-12).</Desc> </Skill> </Skills> </Category>
Ich habe jetzt verschiendes probiert aber finde keine Lösung , vielleicht hat jemand eine Idee worans liegen kann...
danke schonmal im vorhinein
Corax
-
Hallo Silverdawn,
... select from x in c.Element("Skills").Elements("Skill") select x.Element("Name").Value;
(du willst ja eine Liste von Skills haben, nicht nur das erste Element)
-
Hmm, sobald ich die where Bedingung drin hab muss ich auf /Category/Id zugreifen, daher muss in der from bedingung definitiv
from c in doc.Elements("Skilllist").Elements("Category")
rein, sonst kann ich auf das unterelement ID nicht mehr zugreifen.
Und sobald ich Element und Elements in einem teil mische beschwert sich der Compiler.
Wenn ich Elements benutze komme ich nicht mehr and das .Value Attribut ran. Klappt zumindest so nicht , oder mache ich da was maßgeblich falsch ?
-
Hallo Silverdawn,
mein Code ersetzt nur deine letzte Zeile (daher ...), insgesamt also (aber von mir natürlich ungetestet):
var skills = from c in doc.Elements("Skilllist").Elements("Category") where Convert.ToString(c.Element("Id").Value) == categoryname select from x in c.Element("Skills").Elements("Skill") select x.Element("Name").Value;
-
Ok habe das ganze jetzt geändert , ist interessant das man unterselects in LINQ machen kann.
Lieder findet dieser aber auch nur das erste Element, nicht aber das 2..
-
Ok Problem gelöst, der select war richtig ,das Problem lag im anschließenden auslesen.
Da man am ende ein IEnumerable in einem IEnumerable zurückbekommt muss man entsprechend
foreach (IEnumerable<string> x in skills) { foreach (var s in x) { MessageBox.Show(s.ToString()); } }
auslesen, damit man alle Ergebnisse bekommt. Ich hoffe mal das hilft Leuten die ähnliche Probleme haben und hier suchen.
Danke für die Hilfe !