Область действия FindChildByXPath

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Вот с чем столкнулся: беру строки таблицы <tr></tr> на страничке в семейство Html Elements, затем перебираю эти элементы и выпарсиваю данные из ячеек через FindChildByXPath.
Код:
HtmlElementCollection PhraseBlocks = BudgetDoc.FindElementsByAttribute("tr", "id", @"tr.*", "regexp");
foreach (HtmlElement PhraseBlock in PhraseBlocks.Elements) {}
Так как я считаю, что контекст поиска уже ограничен, то использую в тексте XPath две косых в начале, например:
Код:
.FindChildByXPath(".//div[@class='my_div']/div/em/a",0);
...но дети ищутся почему-то по всему документу! В данном случае - при каждом шаге цикла foreach получаем HtmlElement из первого экземпляра коллекции. Почему так?

Если ставлю точку перед началом пути, то всё работает нормально:
Код:
.FindChildByXPath(".//div[@class='my_div']/div/em/a",0);
Вопрос: а какой смысл тогда делать семейство строк таблицы, если оно ничего не ограничивает и поиск в итоге ведётся по всему документу? Я изначально пытаюсь таким образом сэкономить вычислительные ресурсы.
 
  • Спасибо
Реакции: Castaneda и Yuriy Zymlex

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Не могу воспроизвести проблему.
Пример наглядный
 

Вложения

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Проект в аттаче. Вот из этой таблички, например, нужно взять этот столбец:

XPath с точкой выдаёт правильный результат:
upload_2015-4-13_21-13-24.png
...а без точки - в каждой итерации повторяет значение первой ячейки.
 

Вложения

Последнее редактирование:

ermax

Client
Регистрация
06.10.2012
Сообщения
142
Благодарностей
51
Баллы
28
5 лет прошло, ошибку так и не и справили.
Столкнулся с ней сегодня тоже.
 
  • Спасибо
Реакции: sydoow

crocogena

Client
Регистрация
22.05.2021
Сообщения
11
Благодарностей
1
Баллы
3
Я тоже
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
Это не ошибка, всегда надо ставить точку, что бы использовать текущий контекст.
Если бы было ограничение, то нельзя было бы получить родителя/соседнего и т.д.
 

Castaneda

Client
Регистрация
24.05.2019
Сообщения
872
Благодарностей
299
Баллы
63
Это не ошибка, всегда надо ставить точку, что бы использовать текущий контекст.
Если бы было ограничение, то нельзя было бы получить родителя/соседнего и т.д.
столкнулся с этой же проблемой. Может пропишете эту точку в справку?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
  • Спасибо
Реакции: Ribas

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)