web-dev-qa-db-fra.com

Boucle Foreach XmlNodeList

Actuellement, j'ai le code suivant:

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

Ce qui ne marche pas, ça me donne System.InvalidCastException sur la ligne foreach.

Le code suivant fonctionne parfaitement (pas foreach, la i est remplacée par un zéro):

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

tweets est une liste de nœuds. Je pense que ce que vous essayez de faire est la suivante:

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

Prendre plaisir,

23
eburgos

. Je sais qu'il y a déjà une réponse marquée, mais vous pouvez le faire comme vous l'avez fait lors de votre premier essai, il vous suffit de remplacer l'entier int par 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);
    }
}
22
YAYAYAYA

Ce n'est pas du type Int. C'est la raison pour laquelle vous obtenez une exception de casting. Vous pouvez soit remplacer int par le type approprié, soit simplement utiliser l’inférence de type (variables implicitement typées) pour gérer cela. Ici, je me sers de typeinference.by en tapant var, le compilateur comprendra qu’il est du type de la variable itérateur dans la collection tweets

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

EDIT: Avec le merveilleux LINQtoXML , votre code peut être réécrit comme ceci. 

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

Toutes les réponses semblent un peu dépassées Imperative examples, donc je vais en ajouter une de déclaration. Cela ne fait pas ce que le PO voulait, mais je suis sûr que vous comprendrez.

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

J'ai remplacé le «je», que vous ne pouvez pas utiliser, par XmlNode, qui sélectionne une seule ligne de votre liste.

0
Joseph