如果元素不存在,则为C#xmlTextReader错误

时间:2012-11-29 09:33:15

标签: c# xml xmltextreader

我正在尝试使用xmlTextReader读取xml文件并将其存储在列表中,但我正在努力克服这个恼人的小错误。让我解释一下:

我将文件中的所有节点存储在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
            });
        }  

代码工作正常,直到第3个xml元素,其中缺少“ReleaseDate”节点。它只是没有。所以会抛出一个错误。

我知道在阅读之前我需要找出一种检查节点是否存在的方法,但是我有点混乱;迄今为止没有任何成功。有没有人有任何想法?感谢。

3 个答案:

答案 0 :(得分:2)

尝试检查null:

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映射到您的班级。

答案 1 :(得分:2)

在访问任何属性之前检查对象是否为null。

release = xn["ReleaseDate"] != null ? xn["ReleaseDate"].InnerXml : string.Empty

答案 2 :(得分:0)

您可以制作扩展方法,例如

 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)
});