Last month I wrote a blog post that covered using the new LINQ to XML support in .NET 3.5. One of
the "gotchas" you often need to deal with when handling raw XML
are cases where XML shapes are irregular and/or missing
elements/attributes. The ?? operator can be very useful in these
scenarios.
For example, let's consider a scenario where we have an XML
file or feed with the following contact data:
Figure 5
We could write the below LINQ to XML code in C# to open the
XML file and retrieve back a sequence of anonymous type objects with "Name",
"Title", "Email" and "YearsAtCompany" properties,
and then databind the results to an <asp:gridview> control on a page:
Figure 6
Notice above how I'm using the explicit conversion operator support on the XElement class
to retrieve strongly typed values from the XML. This enables me to just cast
the c.Element("YearsAtCompany") value to an int - and it will then
automatically convert the string value to an integer for me, and type the
"YearsAtCompany" property on my anonymous type to be an int.
When we run the above code snippet, we'll then get a nice
Gridview listing of our contacts:
Figure 7
This explicit conversion support works great when the
<YearsAtCompany> element is always defined. But it will throw a
runtime error in the case where we have a <Contact> that is missing
a <YearsAtCompany> sub-element:
Figure 8
One way to fix this is to modify our LINQ to
XML query so that we indicate that YearsAtCompany is a nullable integer.
We can do this by changing the explicit cast to be (int?) instead of (int):
Figure 9
This enables our query to execute cleanly and
not raise any errors. Instead a null value will be assigned to the
YearsAtCompany property if no <YearsAtCompany> element is present in the
XML.
When we run the application and databind the
results to the Gridview, you can see the YearsAtCompany column for our
third contact is empty as a result (since the value is null):
Figure 10
But what if we didn't want a missing XML value
to result in a null integer value - but instead just indicate a value of
0?
Well.... that is where we can use the new ??
operator support. We can just modify the LINQ to XML query like below to
indicate a default value of 0 if no element is present:
Figure 11
This indicates that if the
<YearsAtCompany> element is missing in the XML, and the result would
otherwise be null, instead assign a value of 0. Notice in the
intellisense above how C# automatically detects that this means that the
YearsAtCompany property on the new anonymous type will never be null - and so
it marks the property to be of type (int) instead of (int?).
And now when we run the page we'll see a value
of 0 show up in our third row instead of a blank value:
Figure 12