Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ和HtmlAgilityPack解析表_C#_Linq_Html Agility Pack - Fatal编程技术网

C# 使用LINQ和HtmlAgilityPack解析表

C# 使用LINQ和HtmlAgilityPack解析表,c#,linq,html-agility-pack,C#,Linq,Html Agility Pack,如何在网页上使用LINQ解析HTML以从表中获取innerhtml值 我正在使用HtmlAgilityPack,希望尽可能好地解析一些值 您看到的号码(00000、00001、00002..)是来自代理的唯一号码 因此,也许有一种方法可以使用LINQ解析这些数字,并从td的 (姓名、123、州和信息)=>00000、约翰、123、空闲、每人一杯咖啡 所以我可以分别调用它们并与它们一起工作-也许是在一个数组中 </TH> </TR> <TR ALIGN

如何在网页上使用LINQ解析HTML以从表中获取
innerhtml

我正在使用
HtmlAgilityPack
,希望尽可能好地解析一些值

您看到的号码(00000、00001、00002..)是来自代理的唯一号码

因此,也许有一种方法可以使用LINQ解析这些数字,并从
td的

(姓名、123、州和信息)=>00000、约翰、123、空闲、每人一杯咖啡 所以我可以分别调用它们并与它们一起工作-也许是在一个数组中

</TH>
    </TR>
    <TR ALIGN=RIGHT>
        <TD ALIGN=LEFT>00000</TD>
        <TD ALIGN=LEFT>John</TD>
        <TD ALIGN=CENTER>123</TD>
        <TD ALIGN=LEFT>IDLE</TD>
        <TD ALIGN=LEFT>coffee</TD>
    </TR>
    <TR ALIGN=RIGHT>
        <TD ALIGN=LEFT>00001</TD>
        <TD ALIGN=LEFT>Lisa</TD>
        <TD ALIGN=CENTER>123</TD>
        <TD ALIGN=LEFT>IDLE</TD>
        <TD ALIGN=LEFT>coffee</TD>
    </TR>
    <TR ALIGN=RIGHT>
        <TD ALIGN=LEFT>00002</TD>
        <TD ALIGN=LEFT>Mary</TD>
        <TD ALIGN=CENTER>123</TD>
        <TD ALIGN=LEFT>IDLE</TD>
        <TD ALIGN=LEFT>coffee</TD>
    </TR>
    <TR ALIGN=RIGHT>
        <TD ALIGN=LEFT>00003</TD>
        <TD ALIGN=LEFT>Tim</TD>
        <TD ALIGN=CENTER>123</TD>
        <TD ALIGN=LEFT>IDLE</TD>
        <TD ALIGN=LEFT>coffee</TD>
    </TR>
....

00000
约翰
123
闲置的
咖啡
00001
丽莎
123
闲置的
咖啡
00002
玛丽
123
闲置的
咖啡
00003
提姆
123
闲置的
咖啡
....
提前谢谢

这看起来很像“请给我我需要的代码问题”,这是我非常不喜欢的。请查看以下内容并确保您理解:

var doc = ... // Load the document
var trs = doc.DocumentNode.Descendants("TR"); // Give you all the TRs
foreach (var tr in trs)
{
  var tds = tr.Descendants("TD").ToArray(); // Get all the TDs
  // Turn them into our datastructure
  var data = new {
             Name  = tds[1].InnerText,
             Number = tds[2].InnerText,
             State = tds[3].InnerText,
             Info  = tds[4].InnerText,
             };
  // Do something with data
}
仅使用LINQ执行此操作:

var data = from tr in doc.DocumentNode.Descendants("TR")
           let tds = tr.Descendants("TD").ToArray()
           select new {
             Name  = tds[1].InnerText,
             Number = tds[2].InnerText,
             State = tds[3].InnerText,
             Info  = tds[4].InnerText,
             };

@flindeberg给出了一个非常合理的答案(+1对他/她),你可以避免像这样的
ToArray

private class Row
{
    public string Name { get; set; }
    public int Number { get; set; }
    public string State { get; set; }
    public string Info { get; set; }
}

var映射=新操作[]
{
(值,行)=>行。名称=值,
(值,行)=>row.Number=int.Parse(值),
(值,行)=>行。状态=值,
(值,行)=>row.Info=value
};
var doc=…//加载文档
var trs=doc.DocumentNode.substands(“TR”);//给你所有的TRs
foreach(trs中的var tr)
{
var row=新行();
tr.TD.Zip(映射,(TD,map)=>
{
地图(td.InnerText,行);
返回true;
});
//您现在有了一个填充的行。
}

这里有一个答案和一个例子:
var mappings = new Action<string, Row>[]
{
    (value, row) => row.Name = value,
    (value, row) => row.Number = int.Parse(value),
    (value, row) => row.State = value,
    (value, row) => row.Info = value
};

var doc = ... // Load the document
var trs = doc.DocumentNode.Descendants("TR"); // Give you all the TRs
foreach (var tr in trs)
{
  var row = new Row();
  tr.Descendants("TD").Zip(mappings, (td, map) =>
  {
      map(td.InnerText, row);
      return true;
  });

  // You now have a populated row.
}