我正在尝试使用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”节点。它只是没有。所以会抛出一个错误。
我知道在阅读之前我需要找出一种检查节点是否存在的方法,但是我有点混乱;迄今为止没有任何成功。有没有人有任何想法?感谢。
答案 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)
});