我正在寻找基于ID名称数组的元素集合。我目前正在使用一个巨大的OR语句:
//*[@id='apple']|//*[@id='orange']|//*[@id='banana']
但手动构建该字符串似乎很麻烦。是否有类似于我可以使用的SQL-esque "WHERE IN [a,b,c]"
运算符?
我正在使用ASP.Net的HTTPAgilityPack,我认为它等同于XPath1.o(随意纠正我。)
感谢。
答案 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')]