XPath ИЛИ, альтернатива - PullRequest
1 голос
/ 21 июня 2011

Я использую CSharp, XPath и HTMLAgility Pack.Я использую строки XPath, такие как:

"//table[3]/td[1]/span[2]/text() | //table[6]/td[1]/span[2]/text()"
"//table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text()"

Разница только в номерах таблиц.Можно ли использовать какую-то другую функцию XPath для замены XPath или |?

Что я на самом деле делаю: С первой строкой XPath (где у меня есть номера таблиц 3 и 6) я извлекаю одно значение.Со второй строкой XPath (где у меня есть номера таблиц 8 и 10), я извлекаю другое значение.

И еще вопрос о производительности - является ли строка XPath //table[8]/td[1]/span[2]/text() быстрее, чем строка XPath с OR //table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text()?Я спрашиваю об этом, потому что у меня есть много строк XPath для многих значений, и если есть разница, которая действительно означает, что мне нужно попробовать что-то еще.Сейчас я не могу провести измерение, поэтому задаю вам этот вопрос, чтобы поделиться вашим опытом.

1 Ответ

3 голосов
/ 22 июня 2011

Во-первых, //table[6] выглядит странно. Вы уверены, что не имеете в виду (//table)[6]? (Первая выбирает каждую таблицу, являющуюся шестым дочерним элементом своего родителя; вторая выбирает шестую таблицу в документе.) Предположим, последняя.

В XPath 2.0 вы можете написать

(//table)[position()=(3,6,8,10)]/td[1]/span[2]/text()

В 1.0 это должно быть

(//table)[position()=3 or position()=6 or position()=8 or position()=10]
    /td[1]/span[2]/text()

Или (в любом выпуске) вы можете написать

((//table)[3] | (//table)[6] | (//table)[8] | (//table)[10])/td[1]/span[2]/text()

На ваш вопрос о производительности невозможно ответить, не зная, какую реализацию XPath вы используете.

...