C# 从指定的子节点提取并计算值位置

C# 从指定的子节点提取并计算值位置,c#,linq-to-xml,C#,Linq To Xml,从这个XHTML源: <div class = "page"> <h1>UNIQUE NAME</h1> <table> <tbody> <tr> <td>DATA TO EXTRACT 1</td> </tr> <tr> <td /> <td />

从这个XHTML源:

<div class = "page">  
<h1>UNIQUE NAME</h1>
  <table>
    <tbody>
      <tr>
        <td>DATA TO EXTRACT 1</td>
      </tr>
      <tr>
        <td />
        <td />
        <td />
        <td />
        <td />
        <td>DATA TO EXTRACT 2</td>
      </tr>
    </tbody>
 </table>
 etc...
这将返回一组值,我确信我可以循环使用这些值,但我确信必须有一种更优雅的方式来实现这个目标


非常感谢

这里有一种使用LINQ的方法:

var choice1 =
    from category in _data.Descendants("div")
    where category.Element("h1").Value == "UNIQUE NAME"
    from row in category.Descendants("tr").Select((element, index) => new { element, index })
    from col in row.element.Elements("td").Select((element, index) => new { element, index })
    where !string.IsNullOrEmpty(col.element.Value)
    select new
    {
        RowIndex = row.index + 1,   // one-based index
        ColIndex = col.index + 1,
        Value = col.element.Value,
    };
有关如何使用结果的示例:

foreach (var v in choice1)
    Console.WriteLine(string.Format(
        "RowIndex = {0}, ColIndex = {1}, Value = \"{2}\".",
        v.RowIndex, v.ColIndex, v.Value));
…这将输出:

RowIndex = 1, ColIndex = 1, Value = "DATA TO EXTRACT 1".
RowIndex = 2, ColIndex = 6, Value = "DATA TO EXTRACT 2".

我觉得Linq不是这份工作的合适工具,或者至少不是最好的。也许像HTMLAgilityPack这样的HTML解析器最适合于此。谢谢Icarus,我将检查一下以供将来参考。
RowIndex = 1, ColIndex = 1, Value = "DATA TO EXTRACT 1".
RowIndex = 2, ColIndex = 6, Value = "DATA TO EXTRACT 2".