2009-08-14 14 views
32

मैं XPath के लिए काफी नया हूं, अब कुछ घंटों के लिए इसके साथ झुका रहा हूं, इसलिए मुझे पूरी तरह से यकीन नहीं है कि आप इसके साथ कुछ भी कर सकते हैं।XPath - किसी अन्य तत्व के बाद पहला तत्व चुनें

ठीक है, यहां परिदृश्य है: मैं एक पृष्ठ से एक लिंक खोजना चाहता हूं। वह लिंक केवल इसके टेक्स्ट मान से पहचानने योग्य है, यानी। < के बीच का पाठ > टैग (< a href = "#" > यह लिंक < >)। अब तक मैंने उस पाठ के तत्वों को जोड़ने के लिए अपने हाथों को पाने में कामयाब रहा है, केवल समस्या यह है कि आसपास के कुछ लोग झूठ बोल रहे हैं।

ये लिंक अव्यवस्थित सूचियों जो एक और लिंक टैग से पहले कर रहे हैं, जो एक बहुत अच्छी "लंगर" बिंदु के रूप में काम करेगा अंतिम तत्व है कि मैं खोजने के लिए (यानी। तो चाहते हैं के लिए खोज शुरू करने से पाए जाते हैं मैं सिर्फ पहले एक से मेल खाता है)

चीज़ें थोड़ी स्पष्ट करने के लिए स्वीकार कर सकता है, यहाँ क्या हो रहा है की एक उदाहरण है:

<a href="#">first dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

<-- *And i would actually want to find the thing from this list* --> 
<a href="#">second dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

और मैं शायद निर्दिष्ट करना चाहिए, कि मैं केवल आर करना चाहते हैं पहले तत्व के साथ एक परिणाम या परिणाम का एक सेट "सही" तत्व - तत्व जो मैं खोजना चाहता हूं।

संपादित करें: सवाल पहले से ही उत्तर दिया गया है, लेकिन कुछ टिप्पणी है कि मैं इतना है कि लोगों को वास्तव में सवाल समझ सकते हैं कि यह एक थोड़ा और अधिक निर्दिष्ट करना चाहिए, वहाँ थे;)

तो विचार का उपयोग किया गया किसी अन्य तत्व के स्थान को निर्दिष्ट करने के लिए एक तत्व जिसमें दस्तावेज़ के चारों ओर बिखरे हुए डुप्लिकेट खोज परिणाम हो सकते हैं।

अनिवार्य रूप से आप इस तरह कुछ ऐसा करेंगे यदि आप ड्रॉपडाउन मेनू के समूह से दिए गए लिंक को ढूंढना चाहते हैं जिसमें समान नाम या मान वाले तत्व होंगे।

यह मूल रूप से यह है। मुझे पता है कि अभी भी बिंदु प्राप्त करना थोड़ा मुश्किल है, लेकिन दुर्भाग्यवश मुझे इसे बेहतर समझाने की कोशिश करने में कठिन समय है। मुझे यकीन है कि कोई और बेहतर काम कर सकता है और यदि ऐसा होता है, तो मैं उस विवरण को शामिल करने में खुश हूं।

+0

प्रश्न अपडेट करें - प्रतिक्रियाओं से, आप देख सकते हैं कि अपने उद्देश्य स्पष्ट नहीं है – Gishu

उत्तर

51

मुझे अपने प्रश्न के माध्यम से दो बार पढ़ें लेकिन मुझे लगता है कि मैं इसे समझता हूं। आप जो रुचि रखते हैं वह भविष्यवाणी करता है। भविष्यवाणियां आपको शर्तों के आधार पर नोड्स लेने की अनुमति देती हैं।

उदाहरण के लिए, तुम कर सकते हो:

//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find'] 

इस में कुछ पाठ के साथ किसी भी लंगर का चयन करेंगे अगले उल पाते हैं, तो यह बच्चों के माध्यम से आगे बढ़ें।

इसके अलावा, आप एक परिणाम के सेट के भीतर स्थितीय सूचकांक निर्दिष्ट कर सकते हैं, तो निम्न XPath एक प्रदर्शन (लेकिन यह आपकी समस्या का समाधान नहीं होगा) है:

//a[text()='first dropdown menu']/ul/li[last()]/a/text() 

या आप भाई बहन भर में नेविगेट करने के लिए कुल्हाड़ियों इस्तेमाल कर सकते हैं/पूर्वजों/बच्चों:

//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text() 

इसलिए मुझे यकीन नहीं है कि मैं आपके प्रश्न को समझ गया हूं लेकिन इससे आपको अपना XPath लिखने में मदद करनी चाहिए।

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

+0

खूबसूरती से काम करता है। धन्यवाद क्रिसकैम! – JHollanti

4

सिर्फ इसलिए मैं इसे सही ढंग से समझ: यदि आप "दूसरी लटकती मेनू"

ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find'] 

इस चाल करना चाहिए के बाद "कुछ लिंक" नोड चाहते हैं (मैं 100% यकीन है कि आप की आवश्यकता होगी नहीं कर रहा हूँ स्थिति() = 1 की जांच करें, लेकिन मुझे लगता है कि यदि आप इसे छोड़ देते हैं, तो यह सभी निम्नलिखित उल से मेल खाता है क्योंकि "सभी" पूर्ववर्ती नोड्स पर निर्भर करता है - जो आपकी शेष xml संरचना पर निर्भर करता है)

+0

असल में मैं के साथ लिंक मूल्य "लिंक मैं खोजना चाहते हैं" खोजने के लिए चाहता था, लेकिन यह सिर्फ क्या करेंगे साथ ही;) मैं इसे थोड़ा सा देख लूंगा। – JHollanti

+0

बस उस भाग को ठीक किया गया :) – Niko

+0

मैंने बस थोड़ा सा पढ़ा है और आपको स्थिति() = last() की स्थिति() = 1 की बजाय स्थिति की आवश्यकता है क्योंकि पहले से ही दस्तावेज़ ऑर्डर में संदर्भ नोड से पहले सभी नोड्स लेते हैं ' – Niko

0

अगर मैं गलत हूं तो मुझे सही करें - आपको "दूसरा ड्रॉप डाउन मेनू" चुनने की आवश्यकता है उपर्युक्त उदाहरण, लेकिन पाठ को डुप्लिकेट किया जा सकता है, इसलिए आपको केवल दूसरा आवश्यकता है। XPath:

//a[text()='second drop down menu'][2] 
+0

हाँ, लेकिन विचार दो अलग "पैरामीटर" द्वारा तत्व को ढूंढना है। पहला पैरामीटर एक टैगिंग "इंडेक्सिंग" है और दूसरा एक विशिष्ट तत्व है जिसे मैं ढूंढना चाहता हूं। तो एक स्थिर स्थिति द्वारा संदर्भित व्यवहार्य नहीं है। – JHollanti

+0

यह वापस आ जाएगा: second drop down menu या कुछ भी नहीं है अगर केवल एक एंकर है जो इससे मेल खाता है –

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