c#使用htmlagilitypack绑定表数据

时间:2017-01-27 01:20:41

标签: c# xpath data-binding nodes html-agility-pack

我从一个表格中组织的网站中提取数据。前两行看起来像这样(我删除了一些样式信息):

<table id="loads">
<thead>
<tr class="tableHeading">
  <th><a original='Load ID'></a></th>
  <th><a original='# of cars'></a></th>
  <th><a original='Year/Make/Model'></a></th>
  <th><a original='Origin City'></a></th>
  <th><a original='Origin State'></a></th>
  <th><a original='Destination City'></a></th>
  <th><a original='Destination State'></a></th>
  <th><a original='Mileage'></a></th>
  <th><a original='Price per Shipment'></a></th>
  <th><a original='Price per Mile'></a></th>
  <th>View</th>
  <th><a original='Comments'></a></th>
</tr>
</thead>

<tbody>
<tr>
  <td>123456789</td>
  <td>1</td>
  <td>2015 GMC TERRAIN SLE</td>
  <td>Los Angeles</td>
  <td>CA</td>
  <td>San Francisco</td>
  <td>CA</td>
  <td>400</td>
  <td>$400</td>
  <td>$1</td>
  <td>
     <a href="/ViewLoad.asp?nload_id=123456789&amp;npickup_code=">
      <img src="/images/icons/view.gif" >
      </a>
  </td>
  <td>Some Text</td>
</tr>

每行有12个单元格 - 除了第11个以外的所有字符串,这是我发布此问题的主要原因之一。

我创建了一个包含13个字符串属性的类。额外的一个(我做的第一个)是Status属性,它将是New或Old。后来我会用New行做一些事情,但现在这不是我的错误。

所以现在我想获取每个单元格的innertext(11除外)并将字符串分配给一个数组。以下是我的步骤:

string collect = webBrowser1.Document.Body.InnerHtml;
string data = WebUtility.HtmlDecode(collect);
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(data);
HtmlNodeCollection rows = htmlDoc.DocumentNode.SelectNodes("//table[@id='loads']//tbody//tr");

注意 - 我检查到这一点,到目前为止所有这些都有效,而且行集合正在收集表格中除了标题之外的所有行(我只在上面显示了一个非标题行,但是有多)。

下一步我迷路了。我试图将单元格字符串转换为字符串数组,并进入在表单级别设置的绑定列表:

BindingSource source = new BindingSource(); /// this binds to the dataviewgrid
BindingList<Load> list = new BindingList<Load>();
BindingList<Load> listDeleted = new BindingList<Load>();
List<Load> sortList = new List<Load>();

这是我的代码:

int rowIndex = 0;

foreach (HtmlNode row in rows)
{
    int columnIndex = 0;
    string[] rowData = new string[13];

    foreach (HtmlNode cell in row.ChildNodes)
    {
        if (columnIndex != 0 && columnIndex != 11)
        {
            rowData[columnIndex - 1] = cell.InnerText;
        }

        rowData[11] = cell.FirstChild.Attributes["href"].Value;

        MessageBox.Show(rowData[11]);
        columnIndex++;
     }

     Load newLoad = new Load(rowData);  

     if (!list.Contains(newLoad) && !listDeleted.Contains(newLoad))
     {
         list.Add(newLoad);
         updated = true;
     }
     else
     {
         int itemIndex = list.IndexOf(newLoad);
         if (itemIndex > 0)
         {
             if (!list[itemIndex].Comments.Equals(newLoad.Comments))
                 {
                     list[itemIndex].Comments = newLoad.Comments;
                     list[itemIndex].Status = "MODIFIED";
                     updated = true;
                 }
          }
       }
       rowIndex++;
   }

}

我不确定在最后一个代码块中我做错了什么 - 非常感谢任何帮助。

0 个答案:

没有答案