如何在这里使用XPath contains()?

rye*_*guy 137 xml xpath

我正在尝试学习xpath.我查看了这里的其他contains()示例,但没有使用AND运算符.我不能让这个工作:

//ul[@class='featureList' and contains(li, 'Model')]
Run Code Online (Sandbox Code Playgroud)

上:

...
<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>
...
Run Code Online (Sandbox Code Playgroud)

Jef*_*tes 193

您只查看li查询中的第一个子项,而不是查找li可能包含该文本的任何子元素'Model'.您需要的是如下查询:

//ul[@class='featureList' and ./li[contains(.,'Model')]]
Run Code Online (Sandbox Code Playgroud)

此查询将为您class提供featureList包含一个或多个li包含文本的子项的元素'Model'.

  • +1 - "./"有点误导 - 它表明除了当前节点之外的任何东西都会被考虑在内,但事实上它是多余的:"// ul [@ class =' featureList'和li [contains(.,'Model')]]"是一回事. (12认同)
  • 是的,我只是具体而言.可能过于具体. (4认同)

Tom*_*lak 57

我已经把我的+1给了Jeff Yates的解决方案.

以下是您的方法不起作用的快速解释.这个:

//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')]

实际上会选择一个节点!


kjh*_*hes 7

这是一个关于XPath中常见误解的旧问题的新答案contains()......

摘要:contains()表示包含子字符串, 包含节点.

详细说明

这个XPath经常被误解:

//ul[contains(li, 'Model')]
Run Code Online (Sandbox Code Playgroud)

错误的解释: 选择那些ul的元素包含li元素与Model它.

这是错误的,因为

  1. contains(x,y)期望x是一个字符串,和
  2. 用于将多个元素转换为字符串的XPath规则如下:

    通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串.如果节点集为空,则返回空字符串.

正确的解释:选择那些ul其元素第一 li的孩子有一个字符串值,包含一个Model字符串.

例子

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> 
Run Code Online (Sandbox Code Playgroud)

的XPath

  • //ul[contains(li, 'Model')]选择one ul元素.

    注:two ul没有选择元素,因为第一个字符串值li的孩子two ul就是Foo,它不包含Model子.

  • //ul[li[contains(.,'Model')]]选择onetwo ul元素.

    注意:两个ul元素都被选中,因为contains()它们li分别应用于每个元素.(因此,避免了棘手的多元素到字符串转换规则.)两个ul元素都有一个li子字符串,其字符串值包含Model子字符串 - li元素的位置不再重要.

也可以看看