2017-03-23 1 views
0

J'utilise HtmlAgilityPack pour trouver tous les éléments, les couleurs et les liens vers les produits sur un site Web. Je veux être en mesure de trouver un élément sur le site en tapant le nom et la couleur dans mon application. Jusqu'à présent, ce que je travaille est: L'application trouve des éléments en utilisant uniquement le nom de l'élément et retourne la dernière chose sur le site avec ce nom. Il y a plusieurs produits avec le même nom mais chacun a une couleur différente.C# - La chaîne publique ne stocke que la dernière valeur en dehors de la collection

Le problème survient lorsque vous incluez la couleur, car il s'agit d'un XPath différent, donc il est stocké dans une collection différente.

Voici mon code:

HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[contains(@class,'inner-article')]//h1//a"); 
HtmlNodeCollection collection2 = doc.DocumentNode.SelectNodes("//*[contains(@class,'inner-article')]//p//a"); 


foreach (var node2 in collection2) 
{ 
string coloursv = node2.InnerHtml.ToString(); 
strColour = coloursv; 

//txtLog.Text += Environment.NewLine + (DateTime.Now.ToString("hh:mm:ss")) + str; - This code returns all colours (If code is ran outside of collection then only last colour in string is returned. 

} 

foreach (var node in collection) 
{ 
string href = node.Attributes["href"].Value; 
var itemname = node.InnerHtml.ToString(); 

if (itemname.Contains(txtKeyword.Text)) 
{ 
txtLog.Text = (DateTime.Now.ToString("hh:mm:ss")) + " - Item Found: " + href + " " + itemname + " " + strColour; //Successfully returns item name, colour and link but always gives last availible on website 
} 
} 

Répondre

0

Ceci est parce que vous ne cessons la propriété Text d'une zone de texte dans une boucle (de sorte que chaque élément remplacera sans cesse la précédente):

foreach (var node in collection) 
{ 
    // Omitted for brevity 

    // This will continually overwrite the contents of your Text property 
    txtLog.Text = ...; 
} 

Si vous souhaitez stocker plusieurs éléments, vous devez soit stocker les résultats dans un type d'objet de collection (tel qu'un ListBox, etc.), soit simplement concaténer vos valeurs dans la zone de texte:

foreach (var node in collection) 
{ 
    // Omitted for brevity 
    var stringToAdd = ...; 
    txtLog.Text += stringToAdd + Environment.NewLine; 
} 

Vous pouvez également accomplir cette tâche en utilisant la classe StringBuilder être un peu plus efficace:

StringBuilder sb = new StringBuilder(); 
foreach (var node in collection) 
{ 
    // Omitted for brevity 
    var stringToAdd = ...; 
    // Append this item to the results 
    sb.AppendLine(stringToAdd); 
} 

// Store the results 
txtLog.Text = sb.ToString(); 
+0

Merci qui fonctionne, mais le problème est qu'il retourne juste tout. Pour une raison quelconque, il ne me laisse pas rechercher une correspondance et renvoie l'élément correspondant qui a le même nom et la même couleur. – Andre