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\nЛондон\r\n\r\n\r\nСмит"
  • [3] = ""
  • [4] = ... еще одна встреча ...

Значение colspan указывает продолжительность. Итак, мои вопросы:

Как я могу сделать значение colspan частью моего результата? Мне нужно знать, что лондонская встреча начинается через 2 единицы времени и длится шесть единиц.

  • [0] = "Понедельник"
  • [1] = "" // Продолжительность перерыва равна 2
  • [2] = "Встреча\r\n \r\n\r\nЛондон\r\n \r\n\r\nСмит" // Продолжительность 6

Благодарю вас!


person user1208574    schedule 13.01.2014    source источник


Ответы (1)


Вероятно, проще всего зафиксировать это в анонимном типе:

 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();
person jessehouwing    schedule 13.01.2014
comment
Я полагаю, что вам нужен : вместо , перед "1" для условного оператора. - person Harrison; 13.01.2014
comment
@ Харрисон, ты абсолютно прав. SO должны добавить Intellisense в свой редактор;). - person jessehouwing; 13.01.2014
comment
Упс. Не увидел комментарий. Теперь это работает. Отличный материал! Благодарю вас! - person user1208574; 15.01.2014