2014-01-13 63 views
0

我想從互聯網上的時間表讀取。HTMLAgilityPack:需要提取colspan值和其他人

這是HTML代碼的一部分:

<TR> 
    <TD rowspan=12 align="center" nowrap="1"> 
     <TABLE> 
      <TR> 
       <TD align="center" nowrap=1><font size="3" face="Arial"><B>Monday</B></font> 
       </TD> 
      </TR> 
     </TABLE> 
    </TD> 
    <TD colspan=2 rowspan=12 align="center" nowrap="1"> 
     <TABLE> 
      <TR> 
       <TD> 
       </TD> 
      </TR> 
     </TABLE> 
    </TD> 
    <TD colspan=6 rowspan=12 align="center" nowrap="1"> 
     <TABLE> 
      <TR> 
       <TD width="33%" nowrap=1><font size="2" face="Arial"><B>Meeting</B></font></TD> 
      </TR> 
      <TR> 
       <TD width="33%" nowrap=1><font size="2" face="Arial"><B>London</B></font></TD> 
       <TD width="33%" nowrap=1><font size="2" face="Arial">Smith</font></TD> 
      </TR> 
     </TABLE> 
    </TD> 
    <TD colspan=4 rowspan=12 align="center" nowrap="1"> 

我設法安裝HTMLAgilityPack和現在實現了這個代碼。後人並跳過似乎是好到目前爲止:

List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table[@border='3']") 
        .Descendants("tr") 
        .Skip(1) 
        .Where(tr => tr.Elements("td").Count() >= 4) 
        .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList()) 
        .ToList(); 

表的結果是這樣的:

  • [0] = 「星期一」
  • [1] = 「」
  • [2] = 「會議\ r \ n \ r \ n \ r \ nLondon \ r \ n \ r \ n \ r \ nSmith」
  • [3] = 「」
  • [4] = ..另一個會議...

colspan值表示持續時間。所以我的問題是:

我怎樣才能讓我的結果colspan部分的價值?我需要知道,倫敦會議在兩個時間單位後開始,持續六個單位。

  • [0] = 「星期一」
  • [1] = 「」 斷裂//持續時間爲2
  • [2] =「會議\ r \ n \ r \ n \ r \ nLondon \ r \ n \ r \ n \ r \ nSmith「//長度爲6

謝謝!

回答

3

在一個匿名類型的捕捉這可能是最簡單的:

var table = doc.DocumentNode.SelectSingleNode("//table[@border='3']") 
       .Descendants("tr") 
       .Skip(1) 
       .Where(tr => tr.Elements("td").Count() >= 4) 
       .Select(tr => tr.Elements("td") 
        .Select(td => new { Text = td.InnerText.Trim(), Duration = td.Attributes["Colspan"] != null ? td.Attributes["Colspan"].Value: "1").ToList()) 
       .ToList(); 

或者創建一個元組的一個實例:

List<List<Tuple<string, string>> table = doc.DocumentNode.SelectSingleNode("//table[@border='3']") 
       .Descendants("tr") 
       .Skip(1) 
       .Where(tr => tr.Elements("td").Count() >= 4) 
       .Select(tr => tr.Elements("td") 
        .Select(td => new Tuple<string,string>(td.InnerText.Trim(), td.Attributes["Colspan"] != null ? td.Attributes["Colspan"].Value: "1").ToList()) 
       .ToList(); 
+0

我相信你想有一個':'而不是','之前''1「'爲你的條件運算符。 – Harrison

+0

@哈里森你是絕對正確的。所以應該將Intellisense添加到他們的編輯器中;)。 – jessehouwing

+0

謝謝。不幸的是,這兩個片段不適合我。 – user1208574