0

我正在尝试使用 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”节点。它只是没有。所以抛出一个错误。

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

4

3 回答 3

2

尝试检查是否为空:

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 自动映射到您的类。

于 2012-11-29T09:36:53.787 回答
2

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

release = xn["ReleaseDate"] != null ? xn["ReleaseDate"].InnerXml : string.Empty
于 2012-11-29T09:36:54.340 回答
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)
});
于 2012-11-29T10:00:29.257 回答