web-dev-qa-db-ja.com

ForeachループXmlNodeList

現在、私は次のコードを持っています:

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

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

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

楽しい、

27
eburgos

。私はすでにマークされた答えがあることを知っていますが、最初の試行で行ったようにあなたはそれを行うことができます、あなたはちょうど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);
    }
}
24
YAYAYAYA

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

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

EDIT:Wonderful 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);
    }
}
5
Shyju

すべての答えは少し時代遅れのようです Imperative ので、宣言的なものを追加します。これはOPが望んでいたことをしていませんが、あなたがポイントを得ると確信しています。

    public static List<System.Xml.XmlNode> toList(System.Xml.XmlNodeList nodelist){
        List<System.Xml.XmlNode> nodes =  new List<System.Xml.XmlNode>();
        foreach (System.Xml.XmlNode node in nodelist)
        {
            nodes.Add(node);
        }
        return nodes;
    }
    public static ReadMeObject setXml(ReadMeObject readmeObject){
        readmeObject.xmlDocument = new System.Xml.XmlDocument();
        readmeObject.xmlDocument.LoadXml("<body>"+readmeObject.htmlStringContent+"</body>");
        System.Xml.XmlNodeList images =  readmeObject.xmlDocument.SelectNodes("//img");
        Array.ForEach(
            Functions.toList( images )
                .Where((image) => image.Attributes != null)
                .Where((image) => image.Attributes["src"] != null)
                .Where((image) => image.Attributes["src"].Value != "")
                .ToArray()                
            , (image) => {
                Console.WriteLine(image.Attributes["src"].Value);
            }
        );
        return readmeObject;
    }
0
HMR
foreach (XmlNode node in tweets)
{
    if (tweets[i].InnerText.Length > 0)
    {
         MessageBox.Show(tweets[node].InnerText);
    }
}

使用できない「I」を、リストの1行を選択するXmlNodeに変更しました。

0
Joseph