Html Agility Pack合并了查询

时间:2011-09-26 10:19:04

标签: c# windows-phone-7 html-parsing html-agility-pack

我有一张桌子:

...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>

我使用此查询来获取innertext信息:

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();

但我还想在数组中添加一个带.kml链接的网址。 所以问题是:如何合并查询以获取innertext和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"

P.S。 the whole table is here.

1 个答案:

答案 0 :(得分:0)

我不担心获取数组数组,如果你得到列表会更好。

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()));
相关问题