2011-01-21 6 views
2

мне нужно выбрать все дочерние узлы (опция тегов) из этого HTML:Xpath выбрать все дочерние узлы

<select name="akt-miest" id="onoffaci"> 
<option value="a_0">Všetci</option> 
<option value="a_1">Iba prihlásení</option> 
<option value="a_5" selected="selected">Teraz na Pokeci</option> 

<optgroup label="Hlavné miestnosti"> 

<option value="m_13">&nbsp;&nbsp;&nbsp;Bez záväzkov</option> 
<option value="m_9">&nbsp;&nbsp;&nbsp;Do pohody</option> 
<option value="m_39">&nbsp;&nbsp;&nbsp;Dámsky klub</option> 

</optgroup> 

Я использую Html ловкость пакет.

Я стараюсь это:

var selectNode = htmlDoc.GetElementbyId("onoffaci"); 

var nodes = selectNode.SelectNodes("option::*"); 

, но я получаю сообщение об ошибке, что XPath имеет недопустимый маркер. Что такое плохо?

Например:

<option value="**a_0**">**Všetci**</option> 

Мне нужно получить значение (A_0) и текст Všetci.

Поэтому я стараюсь первый доступ, чтобы выбрать по Id:

+1

Возможный дубликат: http://stackoverflow.com/questions/4758644/parsing-html-with-html-agillity-pack – Shikiryu

+0

Хороший вопрос, +1. См. Мой ответ для объяснения проблемы, несколько разных выражений XPath, которые вы можете использовать, и объяснение их значения. –

ответ

3

Я стараюсь это:

var selectNode = htmlDoc.GetElementbyId("onoffaci"); 
var nodes = selectNode.SelectNodes("option::*"); 

, но я получаю сообщение об ошибке, что XPath имеет недопустимый маркер. Что такое плохо?

Очевидной проблемой является использование

option::*

option::* означает: Все узлы в "опции" оси. Однако нет «оси варианта в XPath»

Вы хотите:

option 

Это выбирает все option элементов, которые являются потомками текущего узла.

Вы можете написать это в одном выражении XPath и опустить getElementbyId() вызов:

//select[@id='onoffaci']/option 

For example: 

    <option value="**a_0**">**Všetci**</option> 

I need get value (a_0) and text Všetci 

Используйте:

//select[@id='onoffaci']/option/@value 
| 
    //select[@id='onoffaci']/option/text() 

Это выбирает все value атрибуты всех option элементов, дети всех select элементов в документе XML, имеющих id со значением 'onoffaci', а также все текстовые узлы всех option элементов, которые являются дочерними элементами всех select элементов в документе XML, которые имеют атрибут id со значением 'onoffaci'.

Вам необходимо будет производить итерацию результатов, чтобы получить @value и text() за каждый элемент option.

Или:

//select[@id='onoffaci']/option[1]/@value 
| 
    //select[@id='onoffaci']/option[1]/text() 

Здесь используется наблюдение, что option элемент вас интересует является первым option потомком своего родителя - теперь это выбирает только value атрибутов и текстовых узлов хотел option в элемент.

+0

Я благодарю вас за вашу помощь и подробные объяснения. я плохо говорят на русском :) –

+0

@ user572844: Добро пожаловать. Спасибо. Русский не является моим матерньiм язьiком. Я родился и вьiрос в Болгарии. :) –

+0

родным, а не «матерным» :) Вы только что сказали: «Русский не мой непристойный язык». Извините за taunting :) – Flack