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

コードは、「ReleaseDate」ノードが欠落している3番目のxml要素まで正常に機能します。ありません。したがって、エラーがスローされます。

ノードを読み取る前に、ノードが存在するかどうかを確認する方法を検討する必要があることはわかっていますが、少し混乱しています。これまでのところ成功したものはありません。誰かアイデアはありますか?ありがとう。

4

3 に答える 3

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 をクラスに自動的にマップできるようになります。

于 2012-11-29T09:36:53.787 に答える
2

プロパティにアクセスする前に、オブジェクトの null を確認してください。

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 に答える