19

現在、次のコードがあります。

XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter");

XmlNodeList tweets = xDoc.GetElementsByTagName("text");
foreach (int i in tweets)
{
    if (tweets[i].InnerText.Length > 0)
    {
         MessageBox.Show(tweets[i].InnerText);
    }
}

これは機能しませんSystem.InvalidCastException。 foreach 行に表示されます。

次のコードは完全に機能します (foreach がなく、iがゼロに置き換えられます)。

XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter");

XmlNodeList tweets = xDoc.GetElementsByTagName("text");

if (tweets[0].InnerText.Length > 0)
{
     MessageBox.Show(tweets[0].InnerText);
}
4

7 に答える 7

30

すでにマークされた回答があることは知っていますが、最初の試行と同じように行うことができます。int を次のように置き換えるだけです。XmlNode

XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter");

XmlNodeList tweets = xDoc.GetElementsByTagName("text");
foreach (XmlNode i in tweets)
{
    if (i.InnerText.Length > 0)
    {
         MessageBox.Show(i.InnerText);
    }
}
于 2012-08-07T14:44:59.623 に答える
29

ツイートはノードリストです。私はあなたがやろうとしていることはこれだと思います:

XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter");

XmlNodeList tweets = xDoc.GetElementsByTagName("text");
for (int i = 0; i < tweets.Count; i++)
{
    if (tweets[i].InnerText.Length > 0)
    {
        MessageBox.Show(tweets[i].InnerText);
    }
}
于 2012-08-07T14:21:24.010 に答える
7

タイプではありませんInt。これが、キャスト例外が発生する理由です。intを適切な型に置き換えるか、型推論(暗黙的に型付けされた変数)を使用してこれを処理することができます。ここで私はtypeinference.byと言ってtypeを使用しています。コンパイラは、それがコレクションvar内のイテレータ変数の型であることを理解します。tweets

foreach (var i in tweets)
{
    if (i!=null)
    {
      string tweet= (((System.Xml.XmlElement)(i))).InnerText;
      MessageBox.Show(tweet);
     }
}

編集:素晴らしいLINQtoXMLを使用すると、コードを次のように書き直すことができます。

string url = "http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=twitter";
XElement elm = XElement.Load(url);
if (elm != null)
{              
    foreach (var status in elm.Elements("status"))
    {
        string tweet = status.Element("text").Value;
        MessageBox.Show(ss);
    }
}
于 2012-08-07T14:20:59.760 に答える
0

この単純な拡張メソッドを使用して、XmlNodeList を反復処理します。

public static void ForEachXml<TXmlNode>(this XmlNodeList nodeList, Action<TXmlNode> action)
{
    foreach (TXmlNode node in nodeList) action(node);
}

メソッド呼び出し:

xDoc.GetElementsByTagName("text").ForEachXML<XmlNode>(tweet => 
    {
        if (tweet.InnerText.Length > 0)
            MessageBox.Show(tweet.InnerText);
    });

于 2019-12-20T08:04:45.723 に答える