在XPath中按属性名称选择多个元素的更好方法

Les*_*ove 4 xpath

我正在寻找基于ID名称数组的元素集合.我目前正在使用一个巨大的OR语句:

//*[@id='apple']|//*[@id='orange']|//*[@id='banana']
Run Code Online (Sandbox Code Playgroud)

但手动构建该字符串似乎很混乱.有没有像"WHERE IN [a,b,c]"我可以使用的一个很好的SQL-esque 运算符?

我正在使用ASPANet的HTTPAgilityPack,我认为它等同于XPath1.o(随意纠正我.)

谢谢.

Dim*_*hev 6

使用

//*[contains('|apple|banana|orange|', concat('|',@id, '|'))]
Run Code Online (Sandbox Code Playgroud)

如果某些id属性可能包含该"|"字符,请使用另一个已知不存在于任何属性值中的字符id

XPath 2.0 解决方案

//*[@id=('苹果', '橙子', '香蕉')]


Joh*_*ica 5

首先,您可以通过使用来简化这一过程or.这可以避免//*多次重复,尽管您要多次指定该@id=部件:

//*[@id='apple' or @id='orange' or @id='banana']
Run Code Online (Sandbox Code Playgroud)

更优雅的解决方案是检查可接受的ID列表.现在如果你正在使用XPath 1.x那么你将需要做一些体操来获得contains()来进行你的竞标.具体来说,请注意我在第一个字符串的两端都有空格,然后@id在寻找匹配之前将空格连接到每一端.这是为了防止一个@id"range"从匹配,例如.

//*[contains(' apple orange banana ', concat(' ', @id, ' '))]
Run Code Online (Sandbox Code Playgroud)

如果您使用的是XPath 2.0,那么由于在语言中添加了序列,前进的方法更简单:

//*[exists(index-of(('apple', 'orange', 'banana'), @id))]
Run Code Online (Sandbox Code Playgroud)