• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 9650
  • 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:
//
//<urls>
//  <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>
//</urls>

Open in new window

0
DanAtkinson
Asked:
DanAtkinson
  • 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

0
 
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.
0
 
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!
//INVALID CODE
string.IsNullOrEmpty(x.Attribute("controller").Value) ? x.Parent.Attribute("controller").Value : x.Attribute("controller").Value

Open in new window

0
 
Kevin CrossChief Technology OfficerCommented:
You are welcome!
0
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

Introducing Cloud Class® training courses

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

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