2013-06-04 24 views
3

當HTML文件中存在複合表時,如何計算父表的行。如何計算html文件中的表中的行C#

我的意思是一個複合表;其中一些單元格中包含其他表格的表格。

這是我的編碼嘗試。注意我收到一個不正確的值:

 String htmlFile = "C:/Temp/Test_13.html"; 
     HtmlDocument doc = new HtmlDocument(); 
     doc.Load(htmlFile); 

     HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table"); 
     HtmlNodeCollection rows = tables[1].SelectNodes(".//tr"); 
     Console.WriteLine(" Rows in second (Parent) table: " + rows.Count()); 

請指出您的答案中使用哪個名稱空間。

下面是一個代表性的樣本文件:

<html> 
<body> 
<table border="1"> 
<tr> 
<td>Apps</td> 
</tr> 
<tr> 
<td>Offcie Web Apps</td> 
</tr> 
</table> 
<br/> 
<table border="1"> 
<tr> 
<td>Application</td> 
<td>Status</td> 
<td>Instances</td> 
</tr> 
<tr> 
<td>PowerPoint</td> 
<td>Online</td> 
<td> 
    <table border="1"> 
    <tr> 
     <td>Server1</td> 
     <td>Online</td> 
    </tr> 
    <tr> 
     <td>Server2</td> 
     <td>Disabled</td> 
    </tr> 
    </table> 
</td> 
</tr> 
<tr> 
<td>Word</td> 
<td>Online</td> 
<td> 
    <table border="1"> 
    <tr> 
     <td>Server1</td> 
     <td>Online</td> 
    </tr> 
    <tr> 
     <td>Server2</td> 
     <td>Disabled</td> 
    </tr> 
    </table> 
</td> 
</tr> 
</table> 
</body> 
</html> 

謝謝。

+0

您使用Visual Studio的,對不對?在調試過程中將鼠標懸停在表格和行數據集上;看看裏面有什麼。 –

回答

0

如果我理解正確,這就是你想要的。

int i = 1; 
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table"); 
foreach (HtmlNode table in tables) 
{ 
    var tmp = table.ParentNode; 
    if (tmp.OriginalName.Contains("td")) 
     MessageBox.Show("The parent of table #" + i + " has" + tmp.ParentNode.ParentNode.Elements("tr").Count().ToString() + " rows."); 
    i++; 
} 

的消息框彈出2次:

"The parent of table #3 has 3 rows." 
"The parent of table #4 has 3 rows." 

編輯(回答問題):

1)我從int i = 1計數器開始。 var i = 1將是相同的東西,它只是自動替換varint

2)我編輯的代碼,現在你必須跟我

3)我開始從1計數相同的結果,所以你有表#1,#表2,表#3和表4#。你的最後兩個表(表#3和#4)是表#2的子表,表#2有3行。我上面的代碼只打印作爲某個表的子表的表。你能告訴我你想要的答案嗎?

編輯2:

int i = 1; 
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table"); 
foreach (HtmlNode table in tables) 
{ 
    if (!table.ParentNode.OriginalName.Contains("td")) // If table is not sub-table 
     MessageBox.Show("Table #" + i + " have " + table.Elements("tr").Count().ToString() + " rows."); 
    i++; 
} 

的消息框彈出2次:

"The parent of table #1 has 2 rows." 
"The parent of table #2 has 3 rows." 
+0

我需要一些幫助。 「i」在它下面有一條曲線,並且有錯誤「名稱'i'在當前上下文中不存在 – user1944272

+0

問題1:我必須初始化變量'i',因爲它下面有一條曲線。問題2:我還有兩條消息返回,它們都表示:'表#0的父項有3行。'你的代碼如何處理?'我是否應該以不同的方式處理這個問題? 問題2: #3「和」#4「?問題3:爲什麼你的代碼給出了」3行「這兩個答案?這是錯誤的。第一個表有2行,不是3.幫助我得到這個返回正確答案。 – user1944272

+0

I編輯我的代碼,並回答你的問題,請看看 – a1204773

1

您可以將每個<table><tr>推送到堆棧,並在遇到時彈出</table> - 彈出直到從堆棧彈出表格。

+0

有更具體的細節是有幫助的。 「堆棧」是什麼意思?你的意思是他們會實例化和解析HTML的數據結構,還是其他的東西?看起來他們並沒有使用這種方法。 此外,請使用圍繞DOM元素的'''',這使得它們更易於閱讀,並且使用圍繞它們的代碼格式(以及您使用的任何其他代碼片段)。謝謝! – bcr

1

我會建議你試試csQuery nuget包。它旨在消除大部分令人頭疼的事情,就像那樣。你可以使用CSS選擇器查詢語法,大多數web開發人員都非常熟悉。在這種情況下,你可能會忘記body > table:nth-of-type(2) > tr,它會返回所有tr的數組,然後對它們進行計數,或者檢查結果數組的長度。另外,body > table ~ table > tr也可以從你給的樣品中起作用,br + table > tr