2014-01-15 3 views
0

Я хочу выбрать узлы, которые имеют класс атрибутов с некоторым значением, не определяющим тег.Как выбрать узлы в XPath, которые имеют некоторый атрибут?

Как это сделать?

До сих пор у меня есть:

html.DocumentNode.SelectNodes("//[@class='value']"); 

Но это не работает хорошо, насколько я вижу.

Например, позвольте мне иметь такой HTML код:

<div> 
    <div class="value"></div> 
    <a class="value"></div> 
</div> 

он должен был бы вернуть мне эти 2 элемента внутри <div>, так <div> и <a>. Это возможно?

+0

Где находится xpath текст? –

+0

"// [@ class = 'значение']"? – Tommz

+1

На это не ответил https://stackoverflow.com/questions/14248063/xpath-to-select-element-with-attribute-value? – 48klocs

ответ

2

Если вы хотите включить в корневой узел, вы можете использовать descendant-or-self доступ как так:

descendant-or-self::*[@class='value'] 

Устранить -or-self, если вы не хотите, чтобы рассмотреть корневой узел. Что еще более важно, звездочка - это то, что говорит парсеру XPath возвращать набор узлов.

3

Так что я считаю, что правильный синтаксис для того, что вы хотите, это:

html.DocumentNode.SelectNodes("//*[@class='value']"); 

Когда вы ищете только атрибут вам не нужно [ ], потому что вы не совершенствуя его элементом.

+0

Nop, потому что ему нужно вернуть узлы. – Tommz

+0

@Tommz, мне было интересно, что, сидя здесь, см. Мое редактирование. –

+1

Yepp, теперь это правильно, но мне нужно дать правильному ответу Хит, так как он правильно ответил сначала :) Большое спасибо. – Tommz

1

Поскольку вы работаете с HTML класса атрибутов здесь, я предлагаю использовать следующие:

//*[contains(concat(' ', @class, ' '), ' value ')] 

Обратите внимание на пробелы, окружающие значение. Это гарантирует, что вы найдете элементы, даже если они имеют несколько классов. Просто использование @class='value' не помогло бы в этой ситуации.

Смежные вопросы