C # HtmlAgilityPack - извлечь значение, соответствующее внешней области видимости <table><table></table></table> - PullRequest
0 голосов
/ 15 октября 2019
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");

Внутренние таблицы выбираются вместо внешних таблиц. Я не могу понять, как "обеспечить, чтобы только родители tr были забраны".

1 Ответ

1 голос
/ 15 октября 2019

Начните выражение 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);
  }
...