Цикл 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);
}

5 ответов

Решение

Твиты это список узлов. Я думаю, что вы пытаетесь сделать это:

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

Наслаждаться,

, Я знаю, что уже есть помеченный ответ, но вы можете сделать это так же, как в первой попытке, вам просто нужно заменить 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);
    }
}

Это не из Int тип, это причина, по которой вы получаете исключение приведения. Вы можете либо заменить int на соответствующий тип, либо просто использовать вывод типа (неявно типизированные переменные) для обработки этого. Здесь я использую typeinference.по словам типа как var, Компилятор поймет, что это тип переменной итератора в tweets коллекция

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

РЕДАКТИРОВАТЬ: с 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);
    }
}

Все ответы кажутся немного устаревшими императивными примерами, поэтому я добавлю декларативный. Это не делает то, что хотел ОП, но я уверен, что вы поймете.

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

Вы можете просмотреть коллекцию с помощью .GetEnumerator()

этот код взят из документации Microsoft:

 XmlNodeList elemList = root.GetElementsByTagName("title");
 IEnumerator ienum = elemList.GetEnumerator();          
 while (ienum.MoveNext()) {   
   XmlNode title = (XmlNode) ienum.Current;
   Console.WriteLine(title.InnerText);
 }
foreach (XmlNode node in tweets)
{
    if (tweets[i].InnerText.Length > 0)
    {
         MessageBox.Show(tweets[node].InnerText);
    }
}

Я изменил "I", которое вы не можете использовать, на XmlNode, который выбирает одну строку вашего списка.

Используйте этот простой метод расширения для перебора 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);
    });

Другие вопросы по тегам