Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 这里如何使用XPath contains()?_Xml_Xpath - Fatal编程技术网

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

Xml 这里如何使用XPath contains()?,xml,xpath,Xml,Xpath,我正在努力学习XPath。我在这里查看了另一个contains()示例,但没有使用AND运算符。我无法让它工作: //ul[@class='featureList' and contains(li, 'Model')] 关于: 。。。 类型:夹式风扇功能:空气移动:65英尺。 安培数:1.1 夹持:夹持高达1.63英寸的任何曲面 插头:重型车型上的3叉接地插头 用法:车库、车间、宿舍、健身室、甲板、办公室等。速度设置:2速颜色:黑色功耗:62瓦高度:14.5英寸宽度:格栅直径:9.5英寸长度

我正在努力学习XPath。我在这里查看了另一个
contains()
示例,但没有使用AND运算符。我无法让它工作:

//ul[@class='featureList' and contains(li, 'Model')]
关于:

。。。
  • 类型:夹式风扇功能:空气移动:65英尺。 安培数:1.1 夹持:夹持高达1.63英寸的任何曲面 插头:重型车型上的3叉接地插头 用法:车库、车间、宿舍、健身室、甲板、办公室等。
  • 速度设置:2速
  • 颜色:黑色
  • 功耗:62瓦
  • 高度:14.5英寸
  • 宽度:格栅直径:9.5英寸长度:11.5英寸
  • 型号#:CR1-0081-06
  • 项目#:N82E16896817007
  • 退货政策:
...
您只查看查询中的第一个
li
子元素,而不是查找可能包含文本的任何
li
子元素,
'Model'
。您需要的是如下所示的查询:

//ul[@class='featureList' and ./li[contains(.,'Model')]]

此查询将为您提供具有
功能列表
的元素,这些元素包含一个或多个
li
子元素,这些子元素包含文本,
'Model'

我已经将+1提供给了Jeff Yates的解决方案

下面是您的方法不起作用的一个快速解释。这:

//ul[@class='featureList' and contains(li, 'Model')]
将实际选择一个节点

粘贴我的
包含
示例:

//table[contains(@class, "EC_result")]/tbody
这是一个关于XPath中
contains()

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

详细说明 这种XPath经常被误解:

//ul[contains(li, 'Model')]
错误解释: 选择那些
ul
元素,这些元素包含
li
元素,其中包含
Model

这是错误的,因为

  • 包含(x,y)
    期望
    x
    为字符串,并且
  • 将多个元素转换为字符串的XPath规则为:

    通过返回 节点集中第一个在中的节点。如果 节点集为空,则返回空字符串

  • 正确解释:选择那些
    ul
    元素,这些元素的第一个
    li
    子元素包含
    模型
    子字符串

    例子 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> 
    
    
    
    • 模型A
    • 模型A
    XPaths

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

      注意:未选择
      two
      ul
      元素,因为第一个子
      li
      的字符串值
      两个
      ul
      中的一个是
      Foo
      ,它不包含
      模型
      子字符串

    • //ul[li[包含(,'Model')]
      选择
      一个
      两个
      ul
      元素

      注意:选择两个
      ul
      元素是因为
      contains()
      分别应用于每个
      li
      。(因此,避免了复杂的多元素到字符串的转换规则。)两个
      ul
      元素都有
      li
      子元素,其字符串值包含
      Model
      子字符串--
      li
      元素的位置不再重要

    另见

    这对我来说是可行的,我在+1上对它进行了测试,“/”有点误导性-它表明,当你不考虑当前节点时,除了它之外的任何东西都会被考虑进去,但实际上它是多余的:“//ul ul[@class='featureList'和li[contains(,'Model')]”是一样的。是的,我只是具体点而已。很可能过于具体。如果
    ul
    中没有
    li
    条件下的
    Model
    ,则
    条件将失败。所以
    条件在空集上返回
    false
    ,对吗?很好的一个条件一直在努力弄清楚为什么像“.//td[contains(.//*,'something')]”这样的查询只能工作到1的深度。我已经想出了如何使它工作,但根本不知道上面的工作原理。我实际需要的是“//td[../*[包含(,'something')]”OP的代码中没有
    元素或
    EC_结果
    类值。这个答案在这里毫无意义,应该删除。
    //ul[contains(li, 'Model')]
    
    <r>
      <ul id="one">
        <li>Model A</li>
        <li>Foo</li>
      </ul>
      <ul id="two">
        <li>Foo</li>
        <li>Model A</li>
      </ul>
    </r> 
    
    //ul[@class="featureList" and li//text()[contains(., "Model")]]