Html敏捷包合并查询

本文关键字:合并 查询 包合并 Html | 更新日期: 2023-09-27 18:09:34

我有一个表格:

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

,但我也想添加到数组的url与。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"

注:

Html敏捷包合并查询

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

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