2009-06-30 18 views
9

XPath सबकुछ क्वेरी कर सकता है चयनकर्ता कर सकते हैं, और अधिक, तो आप कभी बाद वाले को कब चुनेंगे? मैंने दोनों की तुलना में कोई गति बेंचमार्क नहीं देखा है, इसलिए अभी मैं सिंटैक्स एकता के आधार पर चयन कर रहा हूं, जो मनमाना लगता है।XPath या क्वेरी चयनकर्ता?

संपादित करें: मुझे शायद यह कहना चाहिए था कि मैं फ़ायरफ़ॉक्स के लिए Greasemonkey स्क्रिप्ट लिख रहा हूं, इसलिए मैं क्रॉस-ब्राउज़र संगतता के बारे में चिंतित नहीं हूं, और इसमें किसी भी पुस्तकालय शामिल नहीं होंगे।

+0

क्या वे दो पूरी तरह से अलग चीजें नहीं हैं? मैंने सोचा कि क्वेरी चयनकर्ता सीएसएस चयनकर्ताओं के लिए था और XPath एक्सएमएल नोड्स/विशेषताओं के लिए है। –

+0

दोनों सीएसएस और एक्सपीएथ चयनकर्ता डीओएम पर काम करते हैं, और जैसे ही एक्सएमएल और एचटीएमएल दस्तावेजों को दस्तावेज़ ऑब्जेक्ट मॉडल के संदर्भ में परिभाषित किया जाता है, आप इन दिनों दोनों का उपयोग कर सकते हैं, 'querySelector *' और 'document.evaluate' के लिए धन्यवाद। पिछली आईई दुनिया (यहां तक ​​कि IE10 की गिनती) में, देशी XPath समर्थन अभी भी HTML दस्तावेज़ों के लिए नहीं है, हालांकि। – ecmanaut

उत्तर

6

आप किस ब्राउज़र का उपयोग कर रहे हैं? सफारी (या आईफोन) में, क्वेरी चयनकर्ता और क्वेरी चयनकर्ता सभी XPath से बहुत तेज हैं। आईई XPath का समर्थन नहीं करता है, और आईई 6 और आईई 7 क्वेरी चयनकर्ता का समर्थन नहीं करते हैं। जॉन रेसिग द्वारा निर्मित सबसे तेज़ क्रॉस-ब्राउज़र चयनकर्ता इंजन Sizzle है। Sizzle भी jQuery में उपयोग किया जाने वाला मुख्य चयनकर्ता इंजन है। यह querySelector का उपयोग करता है जहां उपयुक्त और सामान्य DOM विधियां जहां querySelector अनुपलब्ध है।

+3

Sizzle http://sizzlejs.com/ – ArtemGr

+0

पर स्थानांतरित हो गया है XPath क्वेरी से अधिक तेज़ है क्रोम 35.0.1916.153 मीटर, ओपेरा 24.0.1555.0 (ब्लिंक इंजन के साथ दोनों), लेकिन querySelectorAll फ़ायरफ़ॉक्स 30.0 में XPath से बहुत तेज़ है परीक्षण: http://jsperf.com/xpath-vs-queryselectorall। तो यह वास्तव में इस्तेमाल किए गए ब्राउज़र पर निर्भर करता है - जो एक प्रासंगिक बिंदु हो सकता है जब उदा। किसी बाहरी पुस्तकालयों का उपयोग किये बिना ब्राउज़र एक्सटेंशन विकसित करना ... लेकिन केवल तभी जब उन मिलीसेकंड ** वास्तव में ** मायने रखता है, जो मुझे लगता है कि अपेक्षाकृत दुर्लभ मामला है। – Sk8erPeter

3

कार्यक्षमता के मामले में आपकी सर्वश्रेष्ठ शर्त एक लाइब्रेरी का उपयोग करना होगा जिसमें एक चयनकर्ता इंजन शामिल है, और उनमें से कई (उदा। म्यूटूल, डोजो, प्रोटोटाइप) कुछ कक्षाओं के प्रश्नों को निष्पादित करने के लिए आंतरिक रूप से XPath का उपयोग कर रहे हैं। आप के लिए उपवास विधि चुनने के लिए आपको एक अच्छी लाइब्रेरी पर भरोसा करने में सक्षम होना चाहिए।

XPath क्वेरी जो कुछ भी कर सकता है वह करने में सक्षम हो सकता है (मुझे लगता है कि यह कथन थोड़ा संदिग्ध है, लेकिन यह बिंदु के बगल में है) लेकिन क्वेरी चयनकर्ता और क्वेरी चयनकर्ता सभी ब्राउज़र द्वारा समर्थित नहीं हैं, इसलिए वास्तव में हमें XPath की तुलना करनी चाहिए देशी डोम क्वेरी किए जाने के तरीकों (यानी getElementsByTagName, getElementById, querySelector, मानक ट्रावर्सल और छानने के तरीकों, आदि)

देशी डोम को छानने के तरीकों का उपयोग करने के लिए ब्राउज़र quirks और सीमाओं के ज्ञान की आवश्यकता है और जल्दी से जटिल क्वेरी के लिए अव्यावहारिक हो जाता है जब तक आप एक पुस्तकालय का उपयोग (जैसे jQuery या MooTools) असंगतताओं को लोहे के लिए। मूल डीओएम तकनीक (चाहे jQuery जैसी प्रॉक्सी के माध्यम से, या कस्टम कार्यान्वयन के माध्यम से) अक्सर XPath पर चुना जाता है कि वे XPath की तुलना में अधिक लचीलापन प्रदान करते हैं। उदाहरण के लिए, यदि आप चेक किए गए इनपुट के लिए फ़िल्टर करना चाहते हैं, तो "छिपा" तत्व या अक्षम इनपुट XPath छोटा हो जाता है लेकिन jQuery आपको देता है: चेक किया गया: छुपा हुआ और: अक्षम छद्म-वर्ग।

1

यदि आप अभी तक XPath नहीं सीखे हैं, लेकिन केवल सीएसएस चयनकर्ताओं के बारे में जानते हैं तो आप केवल क्वेरी सिलेक्टर का उपयोग करेंगे। इसके अलावा, सरल प्रश्नों के लिए भी XPath वाक्यविन्यास अधिक जटिल हो सकता है। इसलिए यदि आपको XPath द्वारा प्रदान की गई शक्ति की आवश्यकता नहीं है, तो इसके बजाय सीएसएस चयनकर्ताओं का उपयोग करना आसान हो सकता है।

आप दो चीजों के बारे में पता होना चाहिए:

  • जब शुद्ध एक्सएमएल पर इस्तेमाल किया आईडी चयनकर्ताओं querySelector साथ काम नहीं करते (या विश्वसनीय नहीं हैं कम से कम)
  • querySelector केवल चयनकर्ताओं के साथ काम करता है कि ब्राउज़र वर्तमान में समर्थन करता है, इसलिए यदि यह कुछ CSS3 चयनकर्ताओं का समर्थन नहीं करता है तो आप उनका उपयोग नहीं कर सकते हैं।
2

CSS सिंटेक्स दो कारणों के लिए भयानक है:

  • यह तेजी से परिमाण के एक आदेश और कम संसाधन और अधिक जटिल XPath से गहन है।
  • जब आप को एक सीएसएस चयनकर्ता के साथ मिलना चाहते हैं, तो एक समान XPath क्वेरी ऐसा करने के लिए अधिकतर समय अधिक पढ़ने और पढ़ने के लिए कठिन होगा।
  • बिंदु में

मामला: इस सीएसएस चयनकर्ता ले: h1.header > a[rel~="author"]

इसका कम से कम कार्यात्मक XPath बराबर//h1[contains(" "+normalize-space(@class)+" "," header ")]/a[contains(" "+normalize-space(@rel)+" "," author ")]

... जो दोनों बहुत कठिन पढ़ना और लिखना है किया जाएगा।

आप के बजाय इस XPath लिखा है: जैसे <h1 class="article header"><a rel="author external" href="/mike">...</a></h1>

//h1[@class="header"]/a[@rel="author"]

... आप गलत तरीके से याद किया है | मार्कअप जब आप वास्तव में जरूरत XPath है, हालांकि, यह एकमात्र विकल्प है, जब तक आप के आसपास चलने के लिए चाहते हैं कोड के साथ मैन्युअल रूप से डोम (जो घृणित तेज़ हो जाता है)।

व्यक्तिगत रूप से (और मैं Greasemonkey के रखरखाव में से एक हूं), मैं अपने सभी नोड स्लाइसिंग आवश्यकताओं के लिए बहुत छोटी on.js लाइब्रेरी का उपयोग करता हूं - जो मुझे XPath दोनों के संयोजन (जब मुझे इसकी आवश्यकता होती है), और सीएसएस (जो मैं लगभग हर समय उपयोग करता हूं) - अधिकांशतः क्योंकि यह मुझे उन सभी कोड को अलग करने देता है जो पृष्ठ के कुछ हिस्सों को खोदने से संबंधित हैं, मुझे स्क्रिप्ट हेडर में पचाने की ज़रूरत है, इसलिए मेरा कोड उन सभी चीजों को पूरा करता है जो इसकी जरूरत है, और वास्तव में वेब पृष्ठों पर मजेदार या महान चीजें करने के बारे में सब कुछ हो सकता है।

वेब ब्राउज़र को जावास्क्रिप्ट को वास्तव में तेज़ चलाने के लिए बहुत अधिक अनुकूलित किया गया है, और यदि मैं आप थे तो मैं डेवलपर के रूप में जो भी आपको सबसे कुशल और खुश करता हूं, उसका उपयोग करने की सलाह दूंगा, ब्राउज़र ब्राउज़र को कम से कम कोड चलाता है। विशेष रूप से on.js के साइड लाभों में से एक यह है कि यह स्वचालित रूप से स्क्रिप्ट्स को अक्सर चलाने में सहायता करता है, उन पृष्ठों पर जहां नोड्स सोचा आसपास थे, को पृष्ठ को नष्ट करने के बजाय, बाहर निकलें ।

संबंधित मुद्दे