从指定的Descendant节点提取并计数值位置

本文关键字:位置 提取 节点 Descendant | 更新日期: 2023-09-27 18:25:42

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

UNIQUE NAME的多个实例具有一组相似的子元素。

我需要找到UNIQUENAME元素,并提取每个子元素标记中的所有值(DATA to extract)。此外,我需要对每个值的位置进行计数。例如,DATA TO EXTRACT 1将处于tr 1,td 1。要提取的数据2将位于tr 2,td 6。

我是linq-to-xml的新手,我想知道是否有人能为我指明战略的正确方向。我已经设法找到了如何使用以下代码访问UNIQUE名称元素:

var choice1 = (from category in _data.Descendants("div")
                       where category.Element("h1").Value == "UNIQUE NAME"
                       select category).DescendantNodes();

这会返回一组值,我确信我可以循环使用这些值,但我确信必须有一种更优雅的方法来实现这个目标。

非常感谢!

从指定的Descendant节点提取并计数值位置

以下是使用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".