În prezent, am următorul cod:
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);
}
}
Care nu funcționează, îmi dă System.InvalidCastException
pe linia foreach.
Următorul cod funcționează perfect (nu există foreach, se folosește i
este înlocuit cu un zero):
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);
}
tweets este o listă de noduri. Cred că ceea ce încercați să faceți este următorul lucru:
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);
}
}
- Am vrut doar să postez că aceasta a fost soluția. Mulțumesc! – > .
Știu că există deja un răspuns marcat, dar poți face la fel ca la prima încercare, trebuie doar să înlocuiești int cu 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);
}
}
Nu este de Int
tip, Acesta este motivul pentru care primiți o excepție de distribuție. Puteți fie să înlocuiți int cu tipul corespunzător, fie să folosiți pur și simplu funcția inferența de tip (variabile implicit tipizate) pentru a rezolva această problemă. Aici folosesc typeinference
.spunând tipul ca var
, compilatorul va înțelege că este de tipul variabilei iterator din tweets
colecție
foreach (var i in tweets)
{
if (i!=null)
{
string tweet= (((System.Xml.XmlElement)(i))).InnerText;
MessageBox.Show(tweet);
}
}
EDIT : Cu Wonderful LINQtoXML, codul dvs. poate fi rescris astfel.
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);
}
}
- Eu folosesc
for
loop, astfel încât să pot itera peste ele. Vă mulțumim pentru răspuns! – > .
Toate răspunsurile par a fi puțin depășite Imperativ așa că voi adăuga un exemplu declarativ. Acesta nu face ceea ce a vrut OP, dar sunt sigur că veți înțelege ideea.
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;
}
foreach (XmlNode node in tweets)
{
if (tweets[i].InnerText.Length > 0)
{
MessageBox.Show(tweets[node].InnerText);
}
}
Am schimbat „I”, pe care nu îl poți folosi, în XmlNode, care selectează o singură linie din lista ta.
Puteți să parcurgeți în buclă colecția cu .GetEnumerator()
acest cod este preluat din documentația Microsoft :
XmlNodeList elemList = root.GetElementsByTagName("title");
IEnumerator ienum = elemList.GetEnumerator();
while (ienum.MoveNext()) {
XmlNode title = (XmlNode) ienum.Current;
Console.WriteLine(title.InnerText);
}
Utilizați această metodă de extensie simplă pentru a itera prin XmlNodeList:
public static void ForEachXml<TXmlNode>(this XmlNodeList nodeList, Action<TXmlNode> action)
{
foreach (TXmlNode node in nodeList) action(node);
}
Apelarea metodei:
xDoc.GetElementsByTagName("text").ForEachXML<XmlNode>(tweet =>
{
if (tweet.InnerText.Length > 0)
MessageBox.Show(tweet.InnerText);
});
tweets
nu este o secvență de numere întregi – este o secvență de noduri… deci de ce te-ai aștepta să poți itera peste ea cuforeach (int i in ...
)? – > Por Jon Skeet.