Как использовать XPath contains () здесь?
Я пытаюсь узнать xpath. Я посмотрел на другие примеры contains () здесь, но ничего, что использует оператор AND. Я не могу заставить это работать:
//ul[@class='featureList' and contains(li, 'Model')]
On:
...
<ul class="featureList">
<li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft.
Amps: 1.1
Clip: Grips any surface up to 1.63"
Plug: 3 prong grounded plug on heavy duty model
Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li>
<li><b>Model #: </b>CR1-0081-06</li>
<li><b>Item #: </b>N82E16896817007</li>
<li><b>Return Policy: </b></li>
</ul>
...
4 ответов:
вы смотрите только на первый
li
ребенок в запросе у вас есть вместо того, чтобы искать любойli
дочерний элемент, который может содержать текст,'Model'
. Что вам нужно, это запрос, как показано ниже://ul[@class='featureList' and ./li[contains(.,'Model')]]
этот запрос даст вам элементы, которые имеют
class
наfeatureList
С одним или болееli
дети, которые содержат текст,'Model'
.
Я уже дал свой +1 к решению Джеффа Йейтса.
вот краткое объяснение почему ваш подход не работает. Это:
//ul[@class='featureList' and contains(li, 'Model')]возникает ограничение
contains()
функция (или любая другая строковая функция в XPath, если на то пошло).первый аргумент должен быть строкой. Если вы кормите его список узлов (давая ему "
li
" делает это), преобразование в строку должно иметь место. Но это преобразование выполняется для первого узла в списке только.в вашем случае первым узлом в списке является
<li><b>Type:</b> Clip Fan</li>
(преобразован в строку: "Type: Clip Fan
"), что означает, что это://ul[@class='featureList' and contains(li, 'Type')]фактически выбрал бы узел!
это новый ответ на старый вопрос о распространенное заблуждение о
contains()
в XPath...резюме:
contains()
означает содержит подстроку,несодержит узел.Подробное Объяснение
этот XPath часто неправильно:
//ul[contains(li, 'Model')]
неправильная интерпретация: Выберите те
ul
элементы это содержат anli
элементModel
в нем.это неправильно, потому что
contains(x,y)
ждетx
быть строкой, иправило XPath для преобразования нескольких элементов в строку этой:
набор узлов преобразуется в строку, возвращая string-value of узел в наборе узлов, который является первым в документ порядок. Если node-set пуст, возвращается пустая строка.
правильное истолкование: выберите те
ul
элементы которого первыйli
ребенок string-value это содержит aModel
подстрока.примеры
XML
<r> <ul id="one"> <li>Model A</li> <li>Foo</li> </ul> <ul id="two"> <li>Foo</li> <li>Model A</li> </ul> </r>
XPaths
//ul[contains(li, 'Model')]
выбираетone
ul
элемент.Примечание: The
two
ul
элемент не выбран, потому что строковое значение первогоli
ребенок изtwo
ul
иFoo
, который не содержитModel
подстрока.
//ul[li[contains(.,'Model')]]
выбираетone
иtwo
ul
элементы.Примечание: и
ul
элементы выбраны, потому чтоcontains()
применяется к каждойli
индивидуально. (Таким образом, хитрое правило преобразования нескольких элементов в строку избегается.) Обаul
элементы естьli
ребенок, строковое значение которого содержитModel
подстрока -- должностьli
элемент больше не вопросы.см. также
Comments