2008-11-26 8 views
9

क्या होगा यदि मेरे पास एक दस्तावेज़ था जिसमें एक ही नाम के साथ कई तत्व थे - उदाहरण के लिए, मैं दूसरा तत्व कैसे प्राप्त करूं?आप XPath में एक ही नाम के साथ कई तत्वों की पहचान कैसे कर सकते हैं?

<doc> 
... 
<element name="same">foo</element> 
... 
<element name="same">bar</element> 
... 
<element name="same">baz</element> 
... 
</doc> 

मैं // ELEM की तरह कुछ उम्मीद थी [@ name = 'एक ही'] [2] काम करने के लिए।

साथ ही, मैं कैसे एक ही नाम

उत्तर

17

[ ] उच्च प्राथमिकता से // (और "//" वास्तव में केवल एक संक्षिप्त नाम है है के साथ तत्वों की एक चर संख्या के साथ xpath में अंतिम तत्व से दूसरे मिलेगा, ऑपरेटर नहीं)। यह इसलिए है क्योंकि XPath 1.0 Spec,

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

और बाद में:

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

इसलिए, XPath अभिव्यक्ति:

        //element[@name='same'][2]

का अर्थ है:

दस्तावेज़ में किसी भी तत्व का चयन करें, कि "तत्व" नाम दिया गया है, के साथ एक विशेषता "नाम" है मूल्य "वही", और यह तत्व अपने माता-पिता का दूसरा ऐसा बच्चा है।

क्या आप चाहते हैं है:

        (//element[@name='same'])[2]

नोट कोष्ठक है, जो [] के उच्च पूर्वता ओवरराइड।

इसी तरह, पिछले लेकिन ऐसे ही एक नोड निम्नलिखित XPath अभिव्यक्ति द्वारा चुना जाता है:

        (//element[@name='same'])[last()-1]

अंत में , एक आवश्यक चेतावनी: के उपयोग " // "संक्षेप बहुत महंगा है क्योंकि यह पूरे (उप) पेड़ को पार करने का कारण बनता है। जब भी दस्तावेज़ की संरचना ज्ञात होती है, तो इसे अधिक विशिष्ट संरचनाओं (स्थान पथ) का उपयोग करने की अनुशंसा की जाती है।

+2

+1, '// पैरा [1]', यानी '/ वंश-या-स्वयं :: नोड()/पैरा [1] 'के उपयोगी स्पष्टीकरण के लिए धन्यवाद,'/वंशज :: पैरा से अलग है [1] '। पुन: "" // "संक्षेप का उपयोग बहुत महंगा है" - मैं कहूंगा "* बहुत महंगा हो सकता है, लेकिन यह प्रोसेसर पर निर्भर करता है।" उदाहरण के लिए सैक्सन ऑप्टिमाइज़ेशन के बारे में बहुत चालाक है, और AFAIU अक्सर "//" अभिव्यक्तियों को तेज़ी से बनाने के लिए स्वचालित रूप से कुंजी बनाता है। – LarsH

+1

@ लार्सएच: हां, आप सैक्सन के अनुकूलन के बारे में सही हैं, लेकिन ये दस्तावेज़ के आकार पर निर्भर करते हैं - मुझे विश्वास नहीं है कि स्वचालित कुंजी इंडेक्स विशाल दस्तावेज़ों के साथ किया जाता है। वैसे भी, लोगों के लिए यह अंगूठे के नियम के रूप में जानना अच्छा है और किसी भी अनुकूलक पर भरोसा नहीं करना अच्छा है। –

+0

मैं मानता हूं, यह अनावश्यक "//" से बचने के लिए अंगूठे का एक अच्छा नियम है जब एक और विशिष्ट पैटर्न या अभिव्यक्ति का उपयोग किया जा सकता है। – LarsH

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