| 

.NET C# Java Javascript Exception

6
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?
15.11.2011
Mario Priebe 6,0k 3 9
1 Antwort
5
Das könnte man evt. mit dem ?: Operator abfangen:
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")
};
15.11.2011
Jürgen Luhr 7,1k 2 9
Dein erstes Beispiel ließe sich noch ein wenig kürzen bei Bedarf:

EAN = i.Element("EAN").Value ?? ""
Karill Endusa 15.11.2011
1
Nein!
Ich prüfe auf i.Element("EAN") und nicht auf i.Element("EAN").Value.
Setze deine Variante in den Code ein. Es wird nicht funktionieren.
Jürgen Luhr 15.11.2011
@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.
Matthias Hlawatsch 15.11.2011
+1 für den Casting-Tip. Hier noch die Doku dazu:
http://msdn.microsoft.com/en-us/library/bb387049.aspx

"LINQ to XML provides explicit cast operators for the following data types: string, bool, bool?, int, int?, uint, uint?, long, long?, ulong, ulong?, float, float?, double, double?, decimal, decimal?, DateTime, DateTime?, TimeSpan, TimeSpan?, GUID, and GUID?."
Matthias Hlawatsch 15.11.2011
@Jürgen und Matthias: argh, das passiert, wenn man nur schnell mal drüber liest :(
Karill Endusa 15.11.2011
Die Casting-Variante ist perfekt. Danke Dir!
Mario Priebe 15.11.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH