किसी तत्व की nth आवृत्ति प्राप्त करने के लिए XPath क्वेरी


135

एक HTML फ़ाइल है (जिसकी सामग्री मैं नियंत्रित नहीं करता है) जिसमें inputसभी तत्व एक ही निश्चित idविशेषता के साथ हैं "search_query"। फ़ाइल की सामग्री बदल सकती है, लेकिन मुझे पता है कि मैं हमेशा inputआईडी विशेषता के साथ दूसरा तत्व प्राप्त करना चाहता हूं "search_query"

मुझे ऐसा करने के लिए एक XPath अभिव्यक्ति की आवश्यकता है। मैंने कोशिश की //input[@id="search_query"][2]लेकिन वह काम नहीं करता है। यहां एक उदाहरण XML स्ट्रिंग है जहां यह क्वेरी विफल हुई:

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

ध्यान रखें कि उपरोक्त केवल एक उदाहरण है और अन्य HTML कोड काफी भिन्न हो सकते हैं और inputतत्व बिना किसी सुसंगत दस्तावेज़ संरचना के साथ कहीं भी दिखाई दे सकते हैं (सिवाय इसके कि मुझे गारंटी है कि inputआईडी आईडी के साथ हमेशा कम से कम दो तत्व होंगे "search_query")।

सही XPath अभिव्यक्ति क्या है?


अच्छा सवाल, +1। समस्या के पूर्ण विवरण और वांछित समाधान के लिए मेरा उत्तर देखें।
दिमित्रे नोवत्चेव

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

जवाबों:


244

यह एक FAQ है :

//somexpression[$N]

इसका मतलब है "द्वारा चयनित प्रत्येक नोड का पता लगाएं //somexpressionकि है $Nउसकी पेरेंट वें बच्चे"।

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

(//input[@id="search_query"])[2]

याद रखें : []ऑपरेटर की //संक्षिप्तता से अधिक पूर्वता (प्राथमिकता) है ।


6
मुझे यह उत्तर पसंद है। मैंने एक पूर्वधारणा मुद्दे पर विचार नहीं किया था (मैंने केवल सरल बाएं-से-दाएं पूर्वता ग्रहण किया था)।
रैलस्टर

10
@ क्रॉस्टर: शब्द "मिसाल" भ्रम हो सकता है। इसका संक्षिप्त रूप //input[@id='search_query'][2]है:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]

21
उन लोगों के लिए जो Google से यहां आए - नंबर 1 से शुरू होता है - [1] पहला तत्व और इसी तरह
Jan Mares

अजीब है कि XPath प्रश्नों में इन प्रकार के सरणियां 1 से शुरू होती हैं, मुझे भ्रमित करती हैं।
Ivotje50

@ Ivotje50 हां XPath अनुक्रम और सरणियाँ 1-आधारित हैं
दिमित्रे नोवाचेव

21

यह काम करने लगता है:

/descendant::input[@id="search_query"][2]

मैं इसे माइकल के द्वारा "XSLT 2.0 और XPath 2.0 प्रोग्रामर के संदर्भ, 4 वें संस्करण" से जाता हूं।

XML पथ भाषा विनिर्देश http://www.w3.org/TR/xpath/#path-abbrev के "संक्षिप्त सिंटैक्स" खंड में एक नोट भी है जो एक सुराग प्रदान करता है।


इस उत्तर के लिए बहुत धन्यवाद। मेरे मामले में स्वीकृत समाधान काम नहीं करेगा क्योंकि मैं रोबोट ढांचे में xpath का उपयोग कर रहा हूं, जो कोष्ठक से शुरू होने वाले पथ को स्वीकार नहीं करेगा। यह एक हालांकि, चाल करना चाहिए
dahui
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.