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

rip*_*234 162 xml xpath

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

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
Run Code Online (Sandbox Code Playgroud)

evi*_*mer 284

//a[contains(@prop,'Foo')]
Run Code Online (Sandbox Code Playgroud)

如果我使用此XML来获取结果,则可以正常工作.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>
Run Code Online (Sandbox Code Playgroud)

编辑:另外需要注意的是,虽然上面的XPath将返回该特定xml的正确答案,如果你想保证你只获得元素"blah"中的"a"元素,你应该像其他人提到的那样使用

/bla/a[contains(@prop,'Foo')]
Run Code Online (Sandbox Code Playgroud)

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

//a[contains(@prop,'Foo')]  
Run Code Online (Sandbox Code Playgroud)

我为了彻底性和stackoverflow的精神添加了这个.:)

  • `xmlme.com`现在重定向到其他主机,似乎没有托管该工具或类似的东西. (3认同)

Ale*_*son 22

无论节点名称或属性名称如何,此XPath都将为您提供包含"Foo"属性的所有节点:

//attribute::*[contains(., 'Foo')]/..
Run Code Online (Sandbox Code Playgroud)

当然,如果你对属性本身的内容更感兴趣,而不一定是他们的父节点,只需删除/ ..

//attribute::*[contains(., 'Foo')]
Run Code Online (Sandbox Code Playgroud)

  • 对于所有节点 `//@*[contains(., 'Foo')]` (3认同)

172*_*729 16

descendant-or-self::*[contains(@prop,'Foo')]
Run Code Online (Sandbox Code Playgroud)

要么:

/bla/a[contains(@prop,'Foo')]
Run Code Online (Sandbox Code Playgroud)

要么:

/bla/a[position() <= 3]
Run Code Online (Sandbox Code Playgroud)

解剖:

descendant-or-self::
Run Code Online (Sandbox Code Playgroud)

轴 - 搜索下面的每个节点和节点本身.这通常比说//更好.我遇到过一些实现,其中//意味着任何地方(根节点的后代或自我).另一个使用默认轴.

* or /bla/a
Run Code Online (Sandbox Code Playgroud)

标签 - 通配符匹配,/ bla/a是绝对路径.

[contains(@prop,'Foo')] or [position() <= 3]
Run Code Online (Sandbox Code Playgroud)

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


tod*_*ddk 6

你有没有尝试过类似的事情:

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

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


Met*_*urf 6

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

/bla/a[contains(@prop, 'Foo')]
Run Code Online (Sandbox Code Playgroud)


Som*_*ere 5

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

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