C# HtmlAgilityPack - 提取外部范围匹配值 <table><table></table></table>

C# HtmlAgilityPack - extract outer scope matched value <table><table></table></table>

string input = @"<table>
    <tr>
        <td>Text A</td>
    </tr>
    <tr>
        <td>
            <table>  <!-- Notice this is an inner scope table -->
                <tr>
                    <td>Text B</td>
                </tr>
            </table>
        </td>
    </tr>
</table>

<table>
    <tr>
        <td>
            <table> <!-- Notice this is an inner scope table -->
                <tr>
                    <td>Text C</td>
                </tr>
            </table>
        </td>
    </tr>
</table>

<table>
    <tr>
        <td>Text D</td>
    </tr>
</table>"

我有一系列上述字符串格式的表格。

我想提取出所有<tr>中第一层的内容,其中期望提取的内容是:

Text A

<table>
    <tr>
        <td>Text B</td>
    </tr>
</table>

<table>
    <tr>
        <td>Text C</td>
    </tr>
</table>

Text D

使用 HtmlAgilityPack:

var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(input);

            var output = htmlDocument.DocumentNode
                .SelectNodes("table/tr");

正在拾取内部表而不是外部表。我不知道如何 "ensure only parent tr's are getting picked up".

/ 开始 XPath 表达式以明确指定相对于文档根的匹配,例如"/table/tr"。这样的表达式匹配预期的内容,但与 <td> 标签一起。要获得与问题表达式中所写完全相同的结果,应更新为 "/table/tr/td":

  var htmlDocument = new HtmlDocument();
  htmlDocument.LoadHtml(input);

  var output = htmlDocument.DocumentNode
    .SelectNodes("/table/tr/td");

  foreach (HtmlNode node in output)
  {
    Console.WriteLine(node.InnerHtml);
  }