XPath का उपयोग करके एक विशिष्ट विशेषता के साथ पहले तत्व का चयन कैसे करें


300

XPath के bookstore/book[1]तहत पहली पुस्तक नोड का चयन करता है bookstore

मैं पहले नोड का चयन कैसे कर सकता हूं जो अधिक जटिल स्थिति से मेल खाता है, उदाहरण के लिए जो पहले नोड से मेल खाता है /bookstore/book[@location='US']

जवाबों:


444

उपयोग:

(/bookstore/book[@location='US'])[1]

यह सबसे पहले पुस्तक तत्वों को 'यूएस' के बराबर स्थान विशेषता के साथ मिलेगा। फिर यह उस सेट से पहले नोड का चयन करेगा। कोष्ठकों के उपयोग पर ध्यान दें, जो कुछ कार्यान्वयनों के लिए आवश्यक हैं।

ध्यान दें, यह /bookstore/book[1][@location='US']तब तक नहीं है जब तक कि पहला तत्व भी उस स्थान की विशेषता न हो जाए।


मैं // बुकस्टोर / पुस्तक [@ स्थान = 'यूएस'] के लिए समान कैसे कर सकता हूं?
अलेक्जेंडर वी। इलिन

7
इससे 'यूएस ’की सभी किताबें मिल जाएंगी। (/ किताबों की दुकान / पुस्तक [@ स्थान = 'यूएस']) [1] को पहला मिलेगा।
केविन ड्रेजर

3
@ केविनड्रेगर /bookstore/book[@location='US'][1]'यूएस' की सभी पुस्तकों को वापस नहीं करता है। मैंने इसे म्यूटेंट बार और विभिन्न भाषाओं में 'xpath कार्यान्वयन' के तहत परीक्षण किया है। /bookstore/book[@location='US'][1]एक किताब की दुकान के तहत पहली 'यूएस' पुस्तक लौटाता है। यदि म्यूटेंट बुकस्टोर हैं, तो यह प्रत्येक से पहला लौटाएगा। यह वही है जो ओपी ने पूछा (बुकस्टोर के तहत पहला नोड)। आपका संस्करण सभी बुकस्टोर्स (पहला मैच) से केवल एक पुस्तक लौटाता है।
जोनाथन फिंगलैंड

3
@JonathanFingland ने आपको गलत समझा - केविनड्रेगर के जवाब को फिर से पढ़ें, साथ ही साथ अलेक्जेंडर वी के संदर्भ में भी। आप दोनों का मतलब एक ही है।
kiedysktos

175

/bookstore/book[@location='US'][1] केवल सरल संरचना के साथ काम करता है।

थोड़ी और संरचना जोड़ें और चीजें टूट जाती हैं।

साथ में

<bookstore>
 <category>
  <book location="US">A1</book>
  <book location="FIN">A2</book>
 </category>
 <category>
  <book location="FIN">B1</book>
  <book location="US">B2</book>
 </category>
</bookstore> 

/bookstore/category/book[@location='US'][1] पैदावार

<book location="US">A1</book>
<book location="US">B2</book>

"पहला नोड जो अधिक जटिल स्थिति से मेल नहीं खाता है"। /bookstore/category/book[@location='US'][2]कुछ नहीं देता।

कोष्ठक के साथ आप मूल प्रश्न के लिए परिणाम प्राप्त कर सकते हैं:

(/bookstore/category/book[@location='US'])[1] देता है

<book location="US">A1</book>

और (/bookstore/category/book[@location='US'])[2]उम्मीद के मुताबिक काम करता है।


11
यहाँ स्वीकृत उत्तर के लेखक। ओपी का प्रश्न माना जाता है /bookstore/book[1]और नहीं (/bookstore/book)[1]। आपके द्वारा प्रदान किया गया मामला वैसा नहीं है, जैसा कि एक ओपी ने पूछा था। संभवतः, ओपी ने मेरे उत्तर को स्वीकार कर लिया क्योंकि उसने वही किया जो उसने अपेक्षित था (और अनुरोध किया था)।
जोनाथन फिंगलैंड

इस जवाब ने मुझे इस अजीबोगरीब मामले में मदद की। क्या कोई समझा सकता है कि वह "अधिक जटिल परिस्थितियों" को क्यों नहीं संभाल पाएगा? चूंकि मूल रूप से यह दो वस्तुओं के साथ एक सूची पाता है, [2] बस इसे (मेरी दुनिया में) चुनना चाहिए
स्कर्पी

मुझे यह उत्तर चयनित उत्तर की तुलना में अधिक सही लगता है, जैसा कि मेरे मामले में, मेरे पास एक अधिक जटिल संरचना भी थी जहां बस जोड़ना [1] ने कई नोड्स लौटा दिए। धन्यवाद!
mydoghasworms 11

2
कोष्ठक काम करता है! आप (..) [1] के बाद और भी पथ जोड़ सकते हैं, जैसे '(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()':। मामले में कई नोड मैच हैं name
१०

1
मैं अपनी राय बदल रहा हूं। कुछ दूरी के बाद, मुझे वह उत्तर मिलता है जो यह कह रहा था, और अगर मैंने ओपी का उदाहरण नहीं देखा तो मैंने इसके लिए मतदान किया। मुझे लगता है कि मैं इस जवाब के लहजे पर प्रतिक्रिया दे रहा था; अगर @tkurki ने पहले नोड के चयन से स्थिति को अलग करने के बारे में थोड़ा और समझाया था, तो मैं तुरंत इसे देखूंगा। शायद जॉनफिंगलैंड के लिए भी ऐसा ही है।
गेरार्ड ओनिल

51

जोनाथन फिंगलैंड के जवाब के स्पष्टीकरण के रूप में:

  • एक ही विधेय ( [position()=1 and @location='US']) में कई स्थितियाँ पूरी तरह सही होनी चाहिए
  • लगातार विधेय में कई शर्तें ( [position()=1][@location='US']) एक के बाद एक सच होनी चाहिए
  • इसका मतलब है कि [position()=1][@location='US']! = [@location='US'][position()=1]
    जबकि [position()=1 and @location='US']==[@location='US' and position()=1]
  • संकेत: एक अकेला [position()=1]संक्षिप्त किया जा सकता है[1]

आप बूलियन ऑपरेटरों " and" और " or", और बूलियन XPath कार्यों के साथ not(), true()और false()। साथ ही आप कोष्ठकों में उप-अभिव्यक्तियों को लपेट सकते हैं।


15

पहले अंग्रेजी पुस्तक नोड (पूरे दस्तावेज़ में) खोजने का सबसे आसान तरीका, अधिक जटिल संरचित xml फ़ाइल को ध्यान में रखते हुए, जैसे:

<bookstore>
 <category>
  <book location="US">A1</book>
  <book location="FIN">A2</book>
 </category>
 <category>
  <book location="FIN">B1</book>
  <book location="US">B2</book>
 </category>
</bookstore> 

xpath अभिव्यक्ति है:

/descendant::book[@location='US'][1]


10
    <bookstore>
     <book location="US">A1</book>
     <category>
      <book location="US">B1</book>
      <book location="FIN">B2</book>
     </category>
     <section>
      <book location="FIN">C1</book>
      <book location="US">C2</book>
     </section>
    </bookstore> 

तो ऊपर दिया गया है; आप के साथ पहली पुस्तक का चयन कर सकते हैं

(//book[@location='US'])[1]

और यह कहीं भी पहला स्थान प्राप्त करेगा जिसका कोई स्थान यूएस है। [ए 1]

//book[@location='US']

स्थान यूएस के साथ सभी पुस्तकों के साथ नोड सेट लौटाएगा। [ए 1, बी 1, सी 2]

(//category/book[@location='US'])[1]

दस्तावेज़ में कहीं भी एक श्रेणी में मौजूद पहली पुस्तक का स्थान US लौटाएगा। [बी 1]

(/bookstore//book[@location='US'])[1]

रूट तत्व बुकस्टोर के तहत कहीं भी मौजूद होने वाले स्थान के साथ पहली पुस्तक लौटाएगा; / किताबों की दुकान का हिस्सा वास्तव में बेमानी बना। [ए 1]

सीधे उत्तर में:

/bookstore/book[@location='US'][1]

पुस्तक के तत्व के साथ बुक एलीमेंट के लिए आपको पहला नोड लौटाएगा जो कि बुकस्टोर के अंतर्गत है [A1]

संयोग से अगर आप चाहते थे, तो इस उदाहरण में पहली ऐसी अमेरिकी पुस्तक को ढूंढना जो किताबों की दुकान का प्रत्यक्ष बच्चा न हो:

(/bookstore/*//book[@location='US'])[1]

4

वांछित नोड प्राप्त करने के लिए सूचकांक का उपयोग करें यदि xpath जटिल है या एक ही xpath के साथ मौजूद एक से अधिक नोड है।

Ex:

(//bookstore[@location = 'US'])[index]

आप जो चाहें वो नंबर दे सकते हैं।


2

अगर दिए गए xml पर नाम स्थान दिया गया है, तो इसका उपयोग करना बेहतर है।

(/*[local-name() ='bookstore']/*[local-name()='book'][@location='US'])[1]


-1

एक ऑनलाइन xpath परीक्षक की मदद से मैं यह उत्तर लिख रहा हूँ ...
इसके लिए:

<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>

निम्नलिखित xpath:

id("t2") / tbody / tr / td[1]

आउटपुट:

123
foo
bar
xyz

चूँकि 1 का अर्थ है उन सभी td तत्वों का चयन करना जो अपने स्वयं के प्रत्यक्ष माता-पिता की पहली संतान हैं।
लेकिन निम्नलिखित xpath:

(id("t2") / tbody / tr / td)[1]

आउटपुट:

123
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.