【问题标题】:C# - Public string only stores last value outside of collectionC# - 公共字符串仅存储集合之外的最后一个值
【发布时间】:2017-03-23 18:21:43
【问题描述】:

我正在使用 HtmlAgilityPack 查找网站上的所有项目、颜色和产品链接。我希望能够通过在我的应用程序中输入名称和颜色来在网站上找到一个项目。

到目前为止,我的工作是: 应用程序仅使用项目名称查找项目,并返回网站上具有该名称的最后一个项目。有多种产品名称相同但颜色不同。

包含颜色时会出现问题,因为它位于不同的 XPath 中,因此存储在不同的集合中。

这是我的代码:

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

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

    这是因为您在循环中不断设置文本框的 Text 属性(因此每个项目将不断覆盖前一个项目):

    foreach (var node in collection)
    {
        // Omitted for brevity
    
        // This will continually overwrite the contents of your Text property
        txtLog.Text = ...;
    }
    

    如果您想存储多个项目,您需要将结果存储在某种类型的集合对象中(例如 ListBox 等),或者只需将您的值连接到文本框中:

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

    您也可以通过使用StringBuilder 类来实现这一点,以提高效率:

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

    【讨论】:

    • 谢谢它的工作,但问题是它只返回所有内容。出于某种原因,它不允许我查找匹配项并返回具有相同名称和颜色的匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多