• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 9393
  • Last Modified:

Check if XAttribute exists inside XElement

Hey experts!

I am working on pulling ASP.NET MVC routes from an external file, and it's going well at the moment. My problem is that I want to be able to return the 'controller' attribute from the 'page' element, or the 'controller' attribute from the 'dir' element (parent of the 'page' element).

The problem is that when this runs, it causes an exception (ArgumentNullException) because I'm trying to retrieve the value of an attribute that doesn't exist.

I realise that, in the snippet, retrieving ControllerName is invalid, but I was trying to highlight what I want to  retrieve.

Any help would be great!

Thanks in advance!
XDocument xDoc = XDocument.Load("urls.xml");
var pages =
  from x in xDoc.Descendants().Elements("page")
  select new
    Name = x.Parent.Attribute("name").Value,
    ControllerName = x.Attribute("controller").Value || x.Parent.Attribute("controller").Value,
    ControllerAction = x.Attribute("action").Value,
    Dir = x.Parent.Attribute("name").Value,
    Url = x.Parent.Attribute("name").Value + "/" + x.Attribute("url").Value,
//An example of the urls.xml files is thus:
//  <dir name="Cheese" controller="Food"> <!-- Always a 'controller' attr on the 'dir' node -->
//    <page url="mexican.htm" action="mexican" controller="bar" />
//    <page url="cheddar.htm" action="cheddar" /> <!-- Note, no controller attribute here ('controller' attr is optional in 'page' node -->
//    <!--...-->
//  </dir>
//  <dir name="Alcohol" controller="Drink">
//  <!--...-->
//  </dir>

Open in new window

  • 3
1 Solution
Kevin CrossChief Technology OfficerCommented:
If I am understanding you correctly and one of the values will at least by blank instead of null, you can use an inline if statement like this:
ControllerName = (x.Attribute("controller")==null ? x.Parent.Attribute("controller").Value : x.Attribute("controller").Value)

Open in new window

Kevin CrossChief Technology OfficerCommented:
Guess you could try nesting too.  Don't believe there are any restrictions stopping you from repeating an inline if in the true section of the first if for x.Parent.Attribute("controller") == null then set some default if true of x.Parent.Attribute("controller").Value if not.
DanAtkinsonAuthor Commented:
Yep, that's the one! I was checking to see if the attribute value string was null or empty, rather than the attribute itself being null.

How stupid am I! :D

Thanks for your speedy answer!
string.IsNullOrEmpty(x.Attribute("controller").Value) ? x.Parent.Attribute("controller").Value : x.Attribute("controller").Value

Open in new window

Kevin CrossChief Technology OfficerCommented:
You are welcome!
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now