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

tweets 是一个节点列表。我认为你想要做的是:

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 as 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);
    }
}
于 2012-08-07T14:20:59.760 回答
1

所有的答案似乎有点过时的命令式示例,所以我将添加一个声明性的示例。这不是 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;
    }
于 2016-12-22T04:24:21.320 回答
1
foreach (XmlNode node in tweets)
{
    if (tweets[i].InnerText.Length > 0)
    {
         MessageBox.Show(tweets[node].InnerText);
    }
}

我已将您无法使用的“I”更改为 XmlNode,它会选择列表中的一行。

于 2017-11-27T00:32:06.787 回答
1

您可以通过 Collection 循环.GetEnumerator()

此代码取自 Microsoft 文档:

 XmlNodeList elemList = root.GetElementsByTagName("title");
 IEnumerator ienum = elemList.GetEnumerator();          
 while (ienum.MoveNext()) {   
   XmlNode title = (XmlNode) ienum.Current;
   Console.WriteLine(title.InnerText);
 }
于 2019-09-25T17:49:29.790 回答
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 回答