HtmlAgilityPack пропустить или удалить вложенную таблицу - PullRequest
0 голосов
/ 08 июня 2011

Я использую 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();

Теперь я могу поиграться с вложенной таблицей и получить то, что хочу (abc, def) ...

Но когда я пытаюсь получить <tr> из родительской таблицы, вот так:

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

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

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

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

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

1 Ответ

0 голосов
/ 08 июня 2011

// - это выражение XPATH, которое означает «сканировать все узлы и подузлы».Вот почему //tr возвращает все tr ниже корневого.

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

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

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