我正在尋找基於ID名稱數組來選擇元素的集合。我目前基本上使用巨大的OR語句:在XPath中通過屬性名稱選擇多個元素的更好方法
//*[@id='apple']|//*[@id='orange']|//*[@id='banana']
但是手動構建該字符串似乎很麻煩。有沒有像我可以使用的漂亮的SQL-esque "WHERE IN [a,b,c]"
運算符?
我使用ASP.Net的HTTPAgilityPack我認爲這等同於XPath1.o(隨時糾正我這句話。)
感謝。
我正在尋找基於ID名稱數組來選擇元素的集合。我目前基本上使用巨大的OR語句:在XPath中通過屬性名稱選擇多個元素的更好方法
//*[@id='apple']|//*[@id='orange']|//*[@id='banana']
但是手動構建該字符串似乎很麻煩。有沒有像我可以使用的漂亮的SQL-esque "WHERE IN [a,b,c]"
運算符?
我使用ASP.Net的HTTPAgilityPack我認爲這等同於XPath1.o(隨時糾正我這句話。)
感謝。
首先,您可以通過使用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中=( '蘋果', '桔子', '香蕉')]
+1以獲得更好的XPath 2.0 expresion。 – 2010-08-26 14:50:39
我無法測試2.0表達式。儘管+1! – LesterDove 2010-08-26 20:16:26
好問題(1)。查看我的答案,獲取選擇所需節點的簡短XPath 1.0表達式。 – 2010-08-26 01:45:56