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

时间:2010-08-26 01:10:34

标签: xpath

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

//*[@id='apple']|//*[@id='orange']|//*[@id='banana']

但手动构建该字符串似乎很麻烦。是否有类似于我可以使用的SQL-esque "WHERE IN [a,b,c]"运算符?

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

感谢。

2 个答案:

答案 0 :(得分:5)

首先,您可以使用or来简化此操作。这样可以避免多次重复//*,尽管您需要多次指定@id=部分:

//*[@id='apple' or @id='orange' or @id='banana']

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

//*[contains(' apple orange banana ', concat(' ', @id, ' '))]

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

//*[exists(index-of(('apple', 'orange', 'banana'), @id))]

答案 1 :(得分:3)

使用

//*[contains('|apple|banana|orange|', concat('|',@id, '|'))]

如果某些id属性可能包含"|"字符,请改用另一个属性,即已知任何id属性的值不存在。< / p>

XPath 2.0解决方案

// * [@ id =('apple','orange','banana')]