Here is the entire code for my class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml.Linq;
namespace SharpDIC.Entities
{
/// <summary>
/// Represents a forum on the Dream.In.Code website.
/// </summary>
public class Forum
{
//Forum information is given by this XML call:
//http://www.dreamincode.net/forums/xml.php?showforum=NUMBER_GOES_HERE
public string Name { get; set; }
public string ID { get; set; }
public string URL { get; set; }
public List<Subforum> Subforums { get; set; }
/// <summary>
/// Load a forum by providing an ID.
/// </summary>
/// <param name="id">A forum's individual ID number.</param>
public Forum(string ID)
{
WebClient webClient = new WebClient();
string htmlSource = webClient.DownloadString(new Uri(String.Format("http://www.dreamincode.net/forums/xml.php?showforum={0}", ID)));
XDocument xml = XDocument.Parse(htmlSource);
var forumXML = xml.Element("ipb").Element("forum");
//Load general profile information.
this.Name = forumXML.Element("name").Value;
this.ID = forumXML.Element("id").Value;
this.URL= forumXML.Element("url").Value;
//Load subforums.
var subforumsXML = xml.Element("ipb").Element("forum").Element("subforums");
this.Subforums = (from forum in subforumsXML.Descendants("forum")
select new Subforum()
{
ID = forum.Element("id").Value,
Name = forum.Element("name").Value,
URL = forum.Element("url").Value,
Description = forum.Element("description").Value,
Type = forum.Element("type").Value,
TopicCount = forum.Element("topics").Value,
ReplyCount = forum.Element("replies").Value,
LastPost = new LastPost()
{
Date = forum.Element("lastpost").Element("date").Value,
Name = forum.Element("lastpost").Element("name").Value,
ID = forum.Element("lastpost").Element("id").Value,
URL = forum.Element("lastpost").Element("url").Value,
UserWhoPosted = new Friend()
{
ID = forum.Element("lastpost").Element("user").Element("id").Value,
Name = forum.Element("lastpost").Element("user").Element("name").Value,
Url = forum.Element("lastpost").Element("user").Element("url").Value,
Photo = forum.Element("lastpost").Element("user").Element("photo").Value,
}
}
}).ToList();
}
}
}
Basically what it does is parse the information from the returned xml of this address:
http://www.dreamincode.net/forums/xml.php?showforum=1
Here’s how I’m running this code:
SharpDIC.Entities.Forum forum = new SharpDIC.Entities.Forum("1");
Console.WriteLine(forum.Name);
Console.WriteLine(forum.URL);
Console.WriteLine(forum.ID);
Console.WriteLine(forum.Subforums[0].LastPost.UserWhoPosted.Name);
Console.ReadLine();
I’m getting an exception on the entire load subforums block; any suggestions?
NullReferenceException was not handled. Object reference not set to an instance of an object.
It’s almost certainly that one of the elements you’re expecting is missing.
If you run it in the debugger you may find that when it throws the exception, it indicates which actual operation it’s on, which would make it much easier.
Alternatively, break out the parsing of individual components into separate methods:
I’ve found this can keep the query expressions more manageable.
One way of avoiding NREs when there’s a missing element that you’re just trying to get the value of is to use a conversion instead of the
Valueproperty, e.g.That will set ID to
nullif theidelement is missing. Obviously if it’s actually a required property, throwing the exception is better, but for optional properties it’s really useful.