HtmlAgilityPack пропускает или удаляет вложенную таблицу

html-agility-pack

Вопрос

Iâ € ™ m с помощью HtmlAgilityPack, чтобы получить следующий html (обратите внимание на вложенную таблицу):

<table class="123">
<tr>
    <table class="789">
    <tr>
        <td>abc</td>
    </tr>
    <tr>
        <td>def</td>
    </tr>
    </table>
</tr>

<tr>
    <td>info 1</td>
</tr>

<tr>
    <td>info 2</td>
</tr>

<tr>
    <td>info 3</td>
</tr>
</table>

Теперь я пытаюсь найти умный способ получить некоторую информацию из родительской таблицы и некоторую информацию из вложенной таблицы ...

Пока у меня есть следующее:

var parentTable = document.DocumentNode.SelectNodes("//table[@class='123']").FirstOrDefault();

var nestedTable = parentTable.SelectNodes("//table[@class='789']").FirstOrDefault();

Теперь я могу поиграть с nestedTable и получить то, что хочу (abc, def) ...

Но когда я пытаюсь получить <tr> â € ™ s из родительской таблицы следующим образом:

var parentTableRows = parentTable.SelectNodes(".//tr");

Он, кажется, включает (в коллекцию) <tr> â € ™ s из вложенной таблицы, а также ...

Другими словами, согласно приведенному выше html-коду, я ожидал иметь набор из 4 <tr> но поскольку он включает в себя <tr> â € ™ s из вложенной таблицы, я получаю набор из 6 <tr> .

Как я могу пропустить первый <tr> который случается, чтобы удерживать вложенную таблицу, чтобы я мог поиграть и получить нужную информацию (info1, info2, info3) (надеюсь, что я получу смысл ...)

Заранее спасибо!

Принятый ответ

// является выражением XPATH, которое означает «сканирование всех узлов и узлов». Вот почему //tr получает все tr ниже корневого.

Если вы просто выполняете parentTable.SelectNodes("tr") (или "./tr" что эквивалентно), вы выберете все TR ниже корневого.

Если вы хотите пропустить первый, вы можете добавить фильтр XPATH на position() элемента position() (функция XPATH):

var parentTableRows = parentTable.SelectNodes("tr[position() > 1]");


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow