I\'m working with an existing XML document which has a structure (in part) like so:
Bob
In a similar situation I used an extension method:
public static string OptionalElement(this XElement actionElement, string elementName)
{
var element = actionElement.Element(elementName);
return (element != null) ? element.Value : null;
}
usage:
id = g.OptionalElement("ID") ?? "none"
How about:
var items = from g in xDocument.Root.Descendants("Group").Elements("Entry")
let idEl = g.Element("ID")
select new
{
name = (string)g.element("Name").Value,
id = idEl == null ? "none" : idEl.Value;
};
if this barfs, then FirstOrDefault() etc might be useful, else just use an extension method (as already suggested).
XElement actually has interesting explicit conversion operators that do the right thing in this case.
So, you rarely actually need to access the .Value property.
This is all you need for your projection:
var items =
from g in xDocument.Root.Descendants("Group").Elements("Entry")
select new
{
name = (string) g.Element("Name"),
id = (string) g.Element("ID") ?? "none",
};
And if you'd prefer to use the value of ID as an integer in your anonymous type:
var items =
from g in xDocument.Root.Descendants("Group").Elements("Entry")
select new
{
name = (string) g.Element("Name"),
id = (int?) g.Element("ID"),
};