Xml 这里如何使用XPath contains()?
我正在努力学习XPath。我在这里查看了另一个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英寸长度
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")]]