Stacey
Stacey

Reputation: 141

Object reference not set to an instance of an object - LINQ

I am totally stumped on this one. I am getting a "Object reference not set to an instance of an object." error - but I can't figure out why. This is the code that I have:

        public class PlayerProfile
    {
        public List<Profile> PlayerINfo = new List<Profile>();


        public void LoadProfiles(string path)
        {
            XDocument xmlDoc = XDocument.Load(path);
            PlayerINfo = new List<Profile>();

// This is where I get the error:
            PlayerINfo = (from profiles in xmlDoc.Root.Element("OnlineProfile").Elements("Player")
                              select new Profile
                              {
                                  Name = (string)profiles.Element("Name"),
                                  Sex = (string)profiles.Element("Sex"),
                                  Avatar = (string)profiles.Element("Avatar").Attribute("path") ?? "",
                                  Created = (DateTime)profiles.Element("Created")
                              }).ToList();


        }
    }

Here is my Profile class:

    public class Profile
{
    public string Name { get; set; }
    public string Sex { get; set; }
    public string Avatar { get; set; }
    public DateTime Created { get; set; }

}

EDIT - Adding the XML file code:

    <?xml version="1.0" encoding="utf-8"?>
<OnlineProfile>
  <Player>
    <Name>Stacey</Name>
    <Sex>Female</Sex>
    <Avatar path="/images/Picture.png" />
    <Ratio>
      <Win>0</Win>
      <Loss>0</Loss>
      <Abandoned>0</Abandoned>
    </Ratio>
    <Created>6/19/2011</Created>
  </Player>

</OnlineProfile>

Upvotes: 0

Views: 2041

Answers (3)

sgtz
sgtz

Reputation: 9019

Tried this out + solved this in visual studio. I see the people above beat me to it. Another way to achieve this is:

xmlDoc.Element("OnlineProfile").Elements("Player")

This is what I posted prior to the Xml becomming available...

here's a good candidate for that error

 (string)profiles.Element("Avatar").Attribute("...

").Attribute would cause an error. You need to check for null.

e.g.

   = profiles.Element("Avatar") != null ? (string)profiles.Element("Avatar").Attribute("... : null;

do you definitely have an element called Avatar in your Xml file. Did the file load in correctly?

Upvotes: 0

Christopher Currens
Christopher Currens

Reputation: 30745

Do this: from profiles in xmlDoc.Element("OnlineProfile").Elements("Player") instead of from profiles in xmlDoc.Root.Element("OnlineProfile").Elements("Player")

From the XML you posted "OnlineProfile" is your Root element, so the child elements you expect arent there.

Upvotes: 1

BrokenGlass
BrokenGlass

Reputation: 161012

from profiles in xmlDoc.Root.Element("OnlineProfile").Elements("Player")

This is the problem - OnlineProfile is your root element, just do

from profiles in xmlDoc.Root.Elements("Player")

Upvotes: 4

Related Questions