WP8上的HTML Agility Pack用法

时间:2014-03-10 21:24:28

标签: c# html-agility-pack

此问题是我在此发布的有关解析HTML Read HTML on Windows Phone 8

的早期问题的后续问题

我正在解析一个包含大量tr标签的HTML页面:

<tr>
        <td class="first">

        </td>
        <td >
            Origin
        </td>
        <td>
              Airline
        </td>
        <td>
            Flight Number
        </td>
        <td>
            22 Feb 11:50
        </td>
        <td class="last">
            Arrived 12:35
        </td>
</tr>

这是我用来阅读页面的代码,它运行正常:

foreach (HtmlNode node in htmlDocument.DocumentNode.SelectNodes("//td"))
{
    string item = node.ChildNodes[0].InnerHtml.Trim();
    lstResults.Items.Add(item)
}

问题是,我想将每组5个TD值连接成一个字符串。目前,代码将每个项目分别添加到lisbox中,因此我基本上每个航班有5个条目,如下所示:

FlightNumber
DueTime
arrival time
Origin
Airline

但我只是想为每个航班添加一个条目,如下所示:

原产地 - 航空公司 - 航班号 - 到期 - 到达

每个航班都有tr标签,每个tr标签内部都有上面显示的信息。我不确定当我到达特定航班的标签末尾时如何检测,因此我可以将信息分组为一个字符串,而不是单独添加每个td标签。每个tr标记的开头或结尾都有一个空白字符串,但我再次无法弄清楚如何将每个td标记的值连接成一个字符串,而不是在单独的行上添加每个值。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我实际上使用了下面的实现。

HtmlNodeCollection table = htmlDocument.DocumentNode.SelectNodes("//tr");

HtmlNodeCollection rows = table[0].SelectNodes("//td");

for (int i = 0; i < rows.Count; ++i)
{
    string flight = rows[i].InnerHtml.Trim();

    if (!flight.Contains(".jpg"))
    {
        item += flight + " - ";
    }
    else
    {
        lstFlights.Items.Add(item);
        item = "";
    }
 }

答案 1 :(得分:0)

您应该尝试添加一个最多为5的int。然后从循环1-5中添加结果到字符串或var。然后只在第5个循环中将该变量转储到列表中作为单个项目。然后,您想将计数器重置为0并重新开始。

Int i =1;
String item = String.Empty;
foreach (HtmlNode node in htmlDocument.DocumentNode.SelectNodes("//td"))
{
    if(i =<5)
    {
      item += node.ChildNodes[0].InnerHtml.Trim();
      i++;
    }
    if (i == 5)
    {
      lstResults.Items.Add(item);
      i = 0;
    }
}