2013-06-27 1 views
1

Я хочу получить доступ к элементу, используя атрибут text() для xpath, имеющий структуру, показанную ниже.XPath innerText, игнорирующий подщипы

<root> 
    <child> 
     <lowerchild> 
      <lowestchild> 
       My text 
      </lowestchild> 
     </lowerchild> 
    </child> 
</root> 

.

//child[contains(text(), 'My text')] 

должен вернуть дочерний элемент. и

//lowerchild[contains(text(), 'My text')] 

следует вернуть нижнюю часть щели.

Я опробовал XPath-команды с помощью HTMLAgilityPack, но они не смогли найти эти элементы.

Окончательный результат моего маленького проекта - маленький искатель xpath, поэтому пользователь дает имя элемента атрибут и значение, поэтому было бы здорово, если бы вы могли дать мне решение только с использованием этой информации. Это может быть любая случайная структура. если имена элементов удваиваются, как если бы у нас было 2 элемента lowchild, то я бы хотел выбрать «нижний» один из самых низких. Надеюсь, ты поможешь мне.

ответ

2

Вместо

//child[contains(text(), 'My text')] 

это выглядит, как вы хотите

//child[contains(., 'My text')] 

Выражение XPath text() (с неявной child:: оси) выбирает любой текстовый узел, который является дочерним узлом контекста. В приведенном выше примере он выбирает только текстовые узлы, которые являются непосредственными дочерними элементами элемента child. В XML, который вы показали, элемент child имеет два дочерних текстовых узла с элементом lowerchild между ними. Оба текстовых узла содержат только пробелы, и по этой причине они могут быть удалены некоторыми процессорами в зависимости от настроек.

Если вы передаете набор узлов или последовательность в качестве первого параметра в contains(a, b), он принимает первый узел и преобразует его в строку. Таким образом, ваш параметр преобразуется в строку, содержащую только пробельные символы, или пустую строку (если узлы текста только для пробелов были разделены).

Но если вместо text() вы передаете . в качестве первого аргумента , то узел контекста (который является child) преобразуется в строку. Это означает объединение значений всего текстового узла потомков из child, а не только непосредственно текстового узла детей. (Это похоже на DOM innerText, который упоминается в заголовке вашего вопроса, но не включает начальные и конечные теги элементов и атрибуты.) По этой причине //child[contains(., 'My text')] вернет элемент child.

+0

Извините, я переводил текст на английский, и поэтому я не видел вашего ответа. – Iwan1993

+0

@OP: Нет проблем ... Я удалил упоминание немецкого языка из моего ответа. Однако я не понимаю последний абзац вашего вопроса. Можете ли вы привести полные примеры того, что вы имеете в виду, когда вы выбираете «нижний» один из самых низких? – LarsH

+0

@ Iwan1993: Помог ли этот ответ? Если нет, не могли бы вы более подробно объяснить, что вам нужно? (См. Предыдущий комментарий.) – LarsH