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

问题描述:

我正在寻找基于ID名称数组来选择元素的集合。我目前基本上使用巨大的OR语句:在XPath中通过属性名称选择多个元素的更好方法

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

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

我使用ASP.Net的HTTPAgilityPack我认为这等同于XPath1.o(随时纠正我这句话。)

感谢。

+0

好问题(1)。查看我的答案,获取选择所需节点的简短XPath 1.0表达式。 – 2010-08-26 01:45:56

首先,您可以通过使用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))] 

使用

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

万一某些id属性可能包含"|"字符,请改用另一个字符,即已知不存在于任何id属性的值。

一个XPath 2.0溶液

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

+0

+1以获得更好的XPath 2.0 expresion。 – 2010-08-26 14:50:39

+0

我无法测试2.0表达式。尽管+1! – LesterDove 2010-08-26 20:16:26