我正在寻找基于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(随意纠正我.)
谢谢.
使用:
//*[contains('|apple|banana|orange|', concat('|',@id, '|'))]
Run Code Online (Sandbox Code Playgroud)
如果某些id属性可能包含该"|"字符,请使用另一个已知不存在于任何属性值中的字符id。
XPath 2.0 解决方案:
//*[@id=('苹果', '橙子', '香蕉')]
首先,您可以通过使用来简化这一过程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)