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


176

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

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

1
为什么每个人都在看“ prop”属性?我错过了什么?它只是说得到前三个节点。

6
每个人都在查看prop属性,因为这就是要问的。获取prop包含“ Foo”的所有节点。添加<a prop="Foo5" />,您将看到为什么它不只是“前三个节点”。
erlando

无论标题为何,正文中的问题措词都不好。foo真的可以包含在任何prop属性中吗,或者您是否真的只想要前三个节点?

3
是的,请参考标题(可以随意编辑)。
ripper234

如果您需要不区分大小写的比较,请参阅查找一个属性
Michael Freidgeim

Answers:


307
//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”元素,则应该像其他人提到的那样使用

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

这将搜索整个xml文档中的所有“ a”元素,而不管嵌套在“ blah”元素中如何

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

我出于透彻考虑和本着stackoverflow的精神添加了此内容。:)


3
xmlme.com现在重定向到其他主机,并且似乎没有托管该工具或类似的工具。
jpmc26

26

此XPath将为您提供所有属性包含“ Foo”的节点,而不管节点名称或属性名称如何:

//attribute::*[contains(., 'Foo')]/..

当然,如果您对属性本身的内容(而不一定是其父节点)更感兴趣,只需删除/.。

//attribute::*[contains(., 'Foo')]

2
对于所有节点//@*[contains(., 'Foo')]
aliopi

16
descendant-or-self::*[contains(@prop,'Foo')]

要么:

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

要么:

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

解剖:

descendant-or-self::

轴-搜索下面的每个节点以及节点本身。通常说起来要比//好。我遇到了一些实现,其中//表示任意位置(根节点的后代或自身)。另一个使用默认轴。

* or /bla/a

标记-通配符匹配,/ bla / a是绝对路径。

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

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


6

John C是最接近的,但是XPath区分大小写,因此正确的XPath将是:

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

4

您是否尝试过类似的方法:

// a [包含(@prop,“ Foo”)]

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


@toddk ...您已针对一个不存在的属性:@foo。您想要定位为@prop ;-)
Metro Smurf

4

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

//a[contains(@href,"/some_link")][text()="Click here"]



1

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


这适用于任何带有foo的元素,但是属性必须为“ prop”
digiguru

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.