Html Agility Pack объединяет запросы - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть таблица вида:

...some td's with not needed links
<td>1010</td>
<td>Building</td>
<td>Adress stree 55</td>
<td>00000 City</td>
<td>
<a href="http://www.adress.xy/file.kml" target="_self">
<img align="top" border="1" src="/custom/img/kml.gif" alt="Details" title="Details" />
</a>
</td>

Я использую этот запрос для получения информации о внутреннем тексте:

HtmlDocumet doc = new HtmlDocument();
        doc.LoadHtml(html);            
        var node = doc.DocumentNode.Descendants("table")
            .FirstOrDefault(x => x.Attributes["style"].Value == "table-layout:auto")
            .Elements("tr")
            .Select(tr => tr.Elements("td").Select(td => td.InnerText).ToArray)).ToArray();

, но я также хотел бы добавить в массив URLсо ссылками .kml.Итак, вопрос: как можно объединить запросы, чтобы получить внутренний текст и ссылку kml?

результат этого запроса:

string[i][j]

, где i = количество tr-элементови j - количество td-элементов

Пример:

string[0][0]="1010"
string[0][1]="Building"

Я также хотел бы иметь: string[i][4] = "http://www.adress.xy/file.kml"

PS вся таблица здесь.

1 Ответ

0 голосов
/ 26 сентября 2011

Я бы не стал беспокоиться о получении массивов массивов, было бы лучше, если бы вместо этого вы получили списки.

const string url = "http://www.rwth-aachen.de/go/id/yvu/scol/1/sasc/1/pl/313";
const string kml = "http://www.adress.xy/file.kml";
var newKml = new[] { kml };

var web = new HtmlWeb();
var doc = web.Load(url);
var xpath = "//table[@style='table-layout:auto']/tr[td]";
var rows = doc.DocumentNode.SelectNodes(xpath);
var table = rows
    .Select(row =>
        row.Elements("td")
           .Skip(1)
           .Take(4)
           .Select(col => System.Net.WebUtility.HtmlDecode(col.InnerText))
           .Concat(newKml)
           .ToList()
    ).ToList();

Я бы подумал о создании анонимного типа для представления ваших строк таким образом, чтобы вы могли дать более полезные имена своим столбцам. Возможно, вместо этого поместите результаты в DataTable.

На тот случай, если вы не сможете использовать xpath по какой-либо причине (или вы хотите знать эквивалентные запросы LINQ), вы можете заменить строку, использующую xpath, следующим образом:

var rows = doc.DocumentNode.Descendants("table")
    .Where(t => t.Attributes["style"].Value == "table-layout:auto")
    .SelectMany(t => t.Elements("tr").Where(tr => tr.Elements("td").Any()));
...