Ich hole mir ein Item aus meinem XML und werte das folgendermaßen aus:
var itemAttr = from i in xml.Item.Descendants("ItemAttributes") select new { Author = i.Element("Author").Value, EAN = i.Element("EAN").Value, Edition = i.Element("Edition").Value, ISBN = i.Element("ISBN").Value, Label = i.Element("Label").Value, Category = i.Element("ProductGroup").Value, PublicationDate = DateTime.Parse(i.Element("PublicationDate").Value).ToShortDateString(), Title = i.Element("Title").Value, Publisher = i.Element("Publisher").Value, ListPrice = i.Element("ListPrice").Element("FormattedPrice").Value };
Nun, wenn ein Element null ist, weil nicht vorhanden, oder falsch geschrieben, dann wird nichts zurückgegeben.
Auf NULL kann ich ja wie folgt prüfen:
var itemAttr = from i in xml.Item.Descendants("ItemAttributes") let element1 = i.Element("Author") where element1 != null let element2 = i.Element("EAN") where element2 != null select new { Author = element1.Value, EAN = element2.Value, ... };
jedoch nützt das nichts, weil auch hier wird nichts zurückgegeben.
Wie ist es mir nun möglich, die Elemente raus zu selektieren, die vorhanden sind, die NUller sollen einfach ignoriert werden?
var itemAttr = from i in xml.Item.Descendants("ItemAttributes") select new { Author = i.Element("Author") != null ? i.Element("Author").Value : "", EAN = i.Element("EAN") != null ? i.Element("EAN").Value : "", etc ... };
(ohne es getestet zu haben und vielleicht gibt es noch schönere Lösungen)
Nachschlag: Das "" hinter dem Doppelpunkt habe ich willkürlich gewählt. Das kann je nach Datentyp ein initialer Wert oder ggf. NULL sein.
Nachschlag2: Die Prüfung auf NULL muss genau umgekehrt sein. Ich habe mein Beispiel korrigiert.
Nachschlag3: Eine schönere Methode ist es, statt ".Value" das Element zu casten. Schau dir folgendes Beispiel an:
XDocument xml = new XDocument( new XDeclaration("1.0", "utf-8", null), new XElement("ItemAttributes", new XElement("Author", "Herr Meier"), new XElement("EAN", 123456)) );
var itemAttr = from i in xml.Elements("ItemAttributes") select new { Author = (string)i.Element("Author"), EAN = (double?)i.Element("EAN") };
@Karill: schön wär's, aber Mario muss prüfen, ob Element("EAN")null ist, und Dein Vorschlag liefert "" für den Fall, dass Element("EAN").Value null ist - wofür aber Element("EAN") schon mal nicht null sein darf.
EAN = i.Element("EAN").Value ?? ""