2012-10-03 106 views
0

我想使用HTML敏捷包解析一些HTML。下面的代碼片段選擇包含我需要的信息的表格元素,但是我需要深入研究表格。例如,一旦我具有表格的InnerHtml,我打算尋找一個<td>,其中的字段值爲「字段#2」。但是,那麼我需要選擇NEXT <td>的內文。在這個例子中,我需要值110。我怎麼做?如何選擇下一個​​元素?

foreach (var x in doc.DocumentNode.SelectNodes("//table[contains(@class,'data')]")) 
{ 
    // psuedo code - search for td and use "contains" on the inner text/html. 
    // Then, grab the next td inner html. 

    Console.WriteLine(x.InnerHtml); 
} 


    <tr> 
    <td width="158"><strong>Field #1:</strong></td> 
    <td width="99">1</td> 
    <td width="119"><strong>Field #2:</strong></td> 
    <td width="176">110</td> 
    </tr> 
    <tr> 
    <td width="158"><strong>Field #3:</strong></td> 
    <td width="99">85</td> 
    <td width="119"><strong>Field #4:</strong></td> 
    <td width="176">-259.34</td> 
    </tr> 
    <tr> 
    <td width="158"><strong>Field #5:</strong></td> 
    <td width="99">1</td> 
    <td width="119"><strong>Field #6:</strong></td> 
    <td width="176">110</td> 
    </tr> 
    <tr> 
    <td width="158"><strong>Field #7:</strong></td> 
    <td width="99">12</td> 
    <td width="119"><strong>Field #8:</strong></td> 
    <td width="176">123.23</td> 
    </tr> 

回答

1

這段代碼會返回你想要的td行。

//<td width="176">110</td> 
var td = x.SelectNodes("//td").SkipWhile(g => !g.InnerText.Contains("Field #2:")).Select(s => s).Skip(1).FirstOrDefault(); 
0

不知道敏捷包支持,但在XPath中可以使用/following-sibling查詢下一個兄弟:

doc.DocumentNode.SelectNodes(
    "//table[contains(@class,'data')]/tr/" + 
     "td[/strong/text()='Field #2:']" + 
     "/following-sibling:td"); 

本質 - 找到所有與給定文本的td節點,和給我它的下一個兄弟td節點。

+0

差不多正確,需要有'。'在'/ strong /'之前和之後的「兄弟姐妹」之後,必須有兩個':'。然後它工作得很好。 – shriek