选择包含“foo”的属性的正确XPath是什么?

220

给定以下 XML,什么 XPath 返回所有 prop 属性中包含 Foo 的元素(前三个节点):

//element[contains(@prop,'Foo')]
<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>

1
为什么每个人都在看“prop”属性?我错过了什么吗?它只是获取前三个节点。 - user4903
7
大家都在关注prop属性,因为这是被要求的。获取所有prop属性包含"Foo"的节点。添加<a prop="Foo5" />,你会看到为什么不仅是“前三个节点”。 - erlando
正文中的问题措辞不当,与标题无关。foo 真的可以在任何属性中吗,还是你只想要前三个节点? - user4903
3
好的,请参考标题(并随意编辑)。 - ripper234
如果您需要不区分大小写的比较,请参见find-an-element-whose-attribute-contains-a-text-case-insensitively - Michael Freidgeim
使用XPath时非常好的链接:http://test-able.blogspot.ie/2016/04/xpath-selectors-cheat-sheet.html - user7813528
10个回答

380
//a[contains(@prop,'Foo')]

如果我使用这个 XML 来获取结果,它就能正常工作。

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

编辑: 另一件需要注意的事情是,虽然上面的XPath将返回该特定XML的正确答案,但如果您想要保证仅获取元素“bla”中的“a”元素,则应按照其他人提到的方法使用


编辑:另外需要注意的是,尽管上述XPath会返回该特定XML的正确答案,但如果您想要确保只获取“bla”元素中的“a”元素,则还应按照其他人提到的方法使用。
/bla/a[contains(@prop,'Foo')]

这将在整个xml文档中搜索所有的"a"元素,而不管它们是否嵌套在"blah"元素中。

//a[contains(@prop,'Foo')]  

为了做到全面,并秉承Stack Overflow的精神,我添加了这句话。 :)


4
"xmlme.com"现在重定向到其他主机,似乎不再提供该工具或任何相关内容。 - jpmc26
这不起作用。我仍然得到所有内容:xidel http://popurls.com/ --extract '//a[contains(@href,'/go/pop')]/@href' - chovy

32

这个 XPath 将会返回所有包含 'Foo' 的属性的节点,无论节点名或者属性名是什么:

//attribute::*[contains(., 'Foo')]/..
当然,如果你更关心属性本身的内容,而不是它们所在的父节点,那就去掉 /..。
//attribute::*[contains(., 'Foo')]

4
对于所有节点 //@*[contains(., 'Foo')] - aliopi
额外信息:@ 是属性的缩写。例如:@hrefattribute::href 的简写。 - Huy Phạm

16
descendant-or-self::*[contains(@prop,'Foo')]
或者:
/bla/a[contains(@prop,'Foo')]

或者:

/bla/a[position() <= 3]

解析:

descendant-or-self::

轴 - 可以搜索其下的每个节点以及节点本身。通常最好使用此术语,而不是 // 。我曾遇到过一些实现中 // 表示任何位置(根节点的后代或自身)。其他情况下则使用默认轴。

* or /bla/a

Tag标签是一种通配符匹配,而/bla/a是一个绝对路径。

[contains(@prop,'Foo')] or [position() <= 3]

[ ]内的条件。@prop是属性::prop的简写,因为attribute是另一个搜索轴。或者您可以使用position()函数选择前3个。


6

你尝试过这样的方法吗:

//a[contains(@prop, "Foo")]

我以前从未使用过contains函数,但我认为它应该像广告中所说的那样工作...


@toddk... 你已经针对一个不存在的属性 @foo 进行了定位。你应该针对 @prop 进行定位;-) - Metro Smurf

6

约翰C最接近了,但XPath是区分大小写的,因此正确的XPath应该是:

/bla/a[contains(@prop, 'Foo')]

5

如果你也需要匹配链接本身的内容,请使用text():

//a[contains(@href,"/some_link")][text()="点击这里"]


2

/bla/a[contains(@prop, "foo")]


2

试试这个:

//a[contains(@prop,'foo')]

这应该适用于文档中的任何"a"标签。


1
对于上面的代码... //*[contains(@prop,'foo')]


这是针对任何具有“foo”的元素,但属性必须为“prop”。 - digiguru

0

你也可以这样使用:

a[@class='specific-class-name' and contains(@href,'/link/to/something')]

这意味着一个带有属性 href 的 a 标签包含特定单词,不要忘记在属性名称前使用@


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接