2009-10-08 1 views
21

सेलेनियम का उपयोग करके वेब पृष्ठों में तत्वों का पता लगाने के दौरान मैं बहुत सारे XPath का उपयोग करता हूं, और हाल ही में नोड 1/वंश :: नोड 2 का उपयोग करने के लिए नोड 1 // नोड 2 का उपयोग करने से दूर चला गया हूं। दो तरीकों के बीच क्या अंतर है? क्या दूसरे की तुलना में एक और अधिक कुशल है?xpath में // नोड और/descendant :: नोड के बीच क्या अंतर है?

उदाहरण एक्सएमएल टुकड़ा प्रदर्शित करने के लिए:

<div id="books"> 
    <table> 
    <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr> 
    <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr> 
    </table> 
</div> 

तो यह होगा:

id('books')//td[@class='title']

या:

id('books')/descendant::td[@class='title']

उत्तर

24

देख http://www.w3.org/TR/xpath#path-abbrev

// सिर्फ एक है डी के लिए संक्षिप्त नाम escendant :: अक्ष

संपादित

के शब्दों में:

// पैरा कम है के लिए/वंशज या स्वयं :: नोड()/बच्चे :: पैरा

यही है, यह सभी पैरा को संदर्भित करता है जो संदर्भ नोड का एक बच्चा है या संदर्भ नोड से निकला कोई भी नोड है। जहां तक ​​मैं कह सकता हूं कि संदर्भ नोड के किसी भी वंशज पैरा में अनुवाद करता है।

+1

लिया गया था मैं पूछ रहा से पहले टी.आर. घूमते जाना चाहिए था। दूसरों के लिए http://www.w3.org/TR/xpath#path-abbrev प्रासंगिक अनुभाग है। ऐसा प्रतीत होता है कि // वंश के लिए छोटा है या स्वयं स्वयं बिल्कुल समान नहीं है।इसके अलावा, मैं // // का उपयोग करने से दूर रहने का कारण यह है कि // नोड [1]/वंश के समान नहीं है :: नोड [1] –

+1

मैंने उपरोक्त उस बिंदु पर विस्तार किया है। // वंशज नहीं है, या स्वयं, यह वंश-या-स्वयं/बच्चा है .... जो मेरे लिए वंश की तरह एक भयानक लग रहा है। –

+0

सहमत हुए। अच्छी तरह से ध्यान दिया। :) –

2

terseness के अलावा, मुझे किसी भी अंतर के बारे में पता नहीं है।

8

संदर्भ समूह में कोई अंतर है। //para[1] /descendant-or-self::node()/child::para[1] के लिए छोटा है, जो प्रत्येक पैरा को अपने माता-पिता का पहला बच्चा देता है। /descendant::para[1] पूरे उपट्री में केवल पहला पैरा देता है।

id('books')/descendant::td[@class='title'] 

वापसी एक ही परिणाम:

+0

इसके अलावा (// पैरा) [1] भी काम करना चाहिए लेकिन सेलेनियम 1 में नहीं है, इसलिए आपको/वंशज :: पैरा [1] का उपयोग करना होगा। कोई भी जानता है कि // node [1] और/descendant :: नोड [1] के बीच संदर्भ समूह को अलग तरीके से कैसे लागू किया जाता है? –

4
अपने मामले

id('books')//td[@class='title'] 

और में

लेकिन वास्तव में, जैसा कि पहले से ही कहा गया था, id('books')//td[@class='title'] का अर्थ id('books')/descendant-or-self::node()/td[@class='title'] है जो अवधारणा में id('books')/descendant::td[@class='title'] से अलग है।

नोट::

निम्नलिखित नोट देखें स्थान पथ // पैरा [1] स्थान पथ/वंशज :: पैरा रूप में एक ही मतलब यह नहीं है [1]। उत्तरार्द्ध पहले वंशज पैरा तत्व का चयन करता है; पूर्व सभी अभिजात वर्ग के तत्वों का चयन करता है जो उनके माता-पिता के पहले पैरा बच्चे हैं।

इस नोट से http://www.w3.org/TR/xpath#path-abbrev