2010-08-26 106 views
4

我正在尋找基於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

回答

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))] 
3

使用

//*[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

相關問題