Ошибка С# xmlTextReader, если элемент не существует

Я пытаюсь прочитать файл xml с помощью xmlTextReader и сохранить его в списке, но я изо всех сил пытаюсь преодолеть эту досадную небольшую ошибку. Позвольте мне объяснить немного больше:

Я сохраняю все узлы из файла в XmlNodeList и использую цикл foreach для чтения каждого узла и добавления его в свой список, используя этот шаблон класса:

public class getGamesList
{
    public int id { get; set; }
    public string title { get; set; }        
    public string release { get; set; }        
    public string platform { get; set; }
}

Вот основной код:

List<getGamesList> list = new List<getGamesList>();
        String URLString = "http://thegamesdb.net/api/GetGamesList.php?name="+name;
        XmlTextReader tr = new XmlTextReader(URLString);

        XmlDocument xml = new XmlDocument();
        xml.Load(tr);
        XmlNodeList xnList = xml.SelectNodes("/Data/Game");

        foreach (XmlNode xn in xnList)
        {
            list.Add(new getGamesList()
            {
                id = Convert.ToInt32(xn["id"].InnerText),
                title = xn["GameTitle"].InnerText,
                release = xn["ReleaseDate"].InnerXml,
                platform = xn["Platform"].InnerText
            });
        }  

Код работает нормально до третьего элемента xml, где отсутствует узел «ReleaseDate». Его просто нет. Так что вылетает ошибка.

Я знаю, что мне нужно найти способ проверить, существует ли узел, прежде чем я его прочитаю, но я немного запутался; ничего пока не удалось. У кого-нибудь есть какие-либо идеи? Спасибо.


person Bagshot    schedule 29.11.2012    source источник
comment
Люди уже дали хорошие ответы, но для дальнейшего использования всегда уточняйте ошибку, которую вы получаете. Выбрасываемая ошибка гораздо менее полезна, чем выдается исключение NullReferenceException в отмеченной строке или что-то в этом роде. Исключения бывают разных видов именно потому, что они помогают отлаживать проблемы, поэтому всегда делитесь ими, если вам нужна помощь! ;-)   -  person Chris    schedule 29.11.2012
comment
@Bagshot Я обновил свой ответ. возможно, это было бы полезно для вас.   -  person KoViMa    schedule 29.11.2012


Ответы (3)


Попробуйте проверить на ноль:

release = (null != xn["ReleaseDate"]) ? xn["ReleaseDate"].InnerXml : "",

ИЗМЕНИТЬ:

Другой способ, который я хотел бы использовать, - добавить атрибуты XML в ваш класс:

[Serializable]
public class getGamesList
{
    [XmlElement("...")]
    public int id { get; set; }
    [XmlElement("...")]
    public string title { get; set; }        
    [XmlElement("ReleaseDate")]
    public string release { get; set; }        
    [XmlElement("...")]
    public string platform { get; set; }
}

Этот рефакторинг позволит вам использовать метод XmlSerializer.Deserialize (раздел "Пример") и автоматически сопоставляйте XML с вашим классом.

person KoViMa    schedule 29.11.2012

Перед доступом к каким-либо свойствам проверьте объект на значение null.

release = xn["ReleaseDate"] != null ? xn["ReleaseDate"].InnerXml : string.Empty
person Ravi Y    schedule 29.11.2012

Вы можете создать метод расширения, что-то вроде

 public static T GetXmlValue<T>(this XmlNode node, string name, T defaultValue)
    {
        if (node != null && node[name] != null)
        {
            if (typeof(T) == typeof(string))
            {
                return (T)(object)node[name].InnerText;
            }
            else if (typeof(T) == typeof(int))
            {
                int value = 0;
                if (int.TryParse(node[name].InnerText, out value))
                {
                    return (T)(object)value;
                }
            }
        }
        return defaultValue;
    }

Применение:

list.Add(new getGamesList()
{
    id = xn.GetXmlValue<int>("id", 0),
    title = xn.GetXmlValue<string>("GameTitle", string.Empty),
    release = xn.GetXmlValue<string>("ReleaseDate", string.Empty),
    platform = xn.GetXmlValue<string>("Platform", string.Empty)
});
person sa_ddam213    schedule 29.11.2012