我从一个表格中组织的网站中提取数据。前两行看起来像这样(我删除了一些样式信息):
<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&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++;
}
}
我不确定在最后一个代码块中我做错了什么 - 非常感谢任何帮助。