2014-08-19 6 views
2

В настоящее время я пытаюсь выяснить, как сократить мой чрезвычайно длинный xpath.Укоротить XPATH с помощью подстановочных знаков

//div[@class='m_set_part'][1]/div/div[2]/div[@class='row']/div[@class='col details detail-head']/div[@class='detail-body']/div[2]/div/div[@class='size']/div/div[@class='m_product_finder_size']/ul/li[1]/span[@class='size-btn']/a 

Это один я прямо сейчас, и это слишком долго, проблема, я нужен первый узел для дифференциации между продуктами. Есть ли способ, чтобы сократить его, как

//div[@class='m_set_part']/*/span[@class='size-btn']/a 

Или я должен пройти через все ChildNodes достичь последние узлы?

Link

Я хочу, чтобы найти для каждого продукта в sizebuttons. По-моему, единственный способ отличить их - добавить [1] или [2] к узлу m_set_part.

+1

ну, без данных, которые мы не можем сказать, если какой-либо более короткий XPath дает правильный результат. Вы можете искать узлы-потомки с помощью '//', то есть '// a' предоставил бы вам все элементы, которые опускаются из элемента контекста. – dirkk

+0

. Я обновил его с дополнительной информацией, надеюсь, что это поможет объяснить что я хочу сделать – chosen

ответ

2

Вы в основном правы. Как сказано в комментариях, вы можете использовать // для выбора потомков или собственных узлов. Таким образом, это даст вам все ссылки Размера:

//span[@class='size-btn']/a 

Как вы предлагаете, вы можете выбрать конкретный продукт, используя позиционный предикат. Однако, если вы предпочитаете, вы также можете использовать другую деталь, например. имя. Это было бы просто

//div[@class="m_set_part"][.//label="Vælg"] 

к дал вам продукт Vælg.

Теперь соединят их обоих, и вы можете получить ссылку на размер для этого, специфических изделий с использованием

//div[@class="m_set_part"][.//label="Vælg"]//span[@class='size-btn']/a 

или с помощью psoitional предиката было бы

//div[@class="m_set_part"][1]//span[@class='size-btn']/a 

Кроме того, убедитесь, что вы используете правильное пространство имен, поскольку это фактический документ XHTML. Другое дело, что вы можете предпочесть использовать contains(@class, 'm_set_part') вместо @class="m_set_part" и т. П., Поскольку запрос будет работать, даже если добавить к этому элементу новые классы CSS.

+0

Думаю, вам не хватает точки впереди, если это '// label'? –

+0

Я имел в виду, что предикат '[// label =" Vælg "]' (с абсолютным путем) будет либо _всегда успешным (если рассматриваемый документ содержит любую метку с этим значением, независимо от того, находится ли она внутри 'div') или _all fail_ (если нет). Если вы хотите выбрать 'div', который _contains_ метку с этим значением, тогда вам нужно использовать относительный путь в предикате, т. Е.' [.// label = "Vælg"] ' –

+0

@IanRoberts да, вы правы. Не знаю, что я там думал ... – dirkk

0

Чтобы ответить на ваш вопрос: Нет, вам не нужно проходить через все узлы.

Вы можете использовать селектор потомок-потомки // для пропускания нулевого или большего количества узлов между предыдущей и следующей частью выражения. Так что //div[@class='m_set_part']//span[@class='size-btn']/a может дать вам именно то, что вы хотите. *, с другой стороны, соответствует любому узлу, но точно одному узлу. Therfore

//div[@class='m_set_part'][1]/*/*[2]/*[@class='row']/*[@class='col details detail-head']/*[@class='detail-body']/*[2]/*/*[@class='size']/*/*[@class='m_product_finder_size']/*/*[1]/*[@class='size-btn']/a

это еще один способ сократить исходное выражение. Будет ли он показываться только заинтересованным узлом или более, зависит только от документа, к которому вы применяете выражение.

+0

Это не совсем короткое выражение, я боюсь. –

+0

: D Вы абсолютно правы! Спасибо за ваше понимание! – Tamas

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