Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Check if XAttribute exists inside XElement

Posted on 2008-10-08
4
8,462 Views
Last Modified: 2013-12-17
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
Comment
Question by:DanAtkinson
  • 3
4 Comments
 
LVL 59

Accepted Solution

by:
Kevin Cross earned 500 total points
ID: 22667753
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
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 22667768
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
 

Author Comment

by:DanAtkinson
ID: 22668101
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
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 22668961
You are welcome!
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
SQL Help 27 57
Problem with SelectList in .NET MVC application 1 27
Code enhancement 4 21
vb.net convert long time to mm:ss 23 12
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

840 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question