XPath का उपयोग कैसे करें () यहाँ है?


142

मैं XPath सीखने की कोशिश कर रहा हूँ। मैंने contains()यहां अन्य उदाहरणों को देखा , लेकिन कुछ भी ऐसा नहीं है जो AND ऑपरेटर का उपयोग करता है । मुझे यह काम करने के लिए नहीं मिल सकता है:

//ul[@class='featureList' and contains(li, 'Model')]

पर:

...
<ul class="featureList">

<li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft.
    Amps: 1.1
    Clip: Grips any surface up to 1.63"
    Plug: 3 prong grounded plug on heavy duty model
    Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li>

<li><b>Model #: </b>CR1-0081-06</li>
<li><b>Item #: </b>N82E16896817007</li>
<li><b>Return Policy: </b></li>
</ul>
...

मेरे लिए यह काम करता है, मैं पर इसका परीक्षण किया whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm
mihi

जवाबों:


199

आप केवल पहली बार में देख रहे liक्वेरी आप के बजाय किसी भी की तलाश में की है में बच्चे li, बच्चे तत्व यह है कि पाठ शामिल हो सकता 'Model'। आपको जो चाहिए वह निम्नलिखित की तरह एक क्वेरी है:

//ul[@class='featureList' and ./li[contains(.,'Model')]]

यह प्रश्न आपको उन तत्वों को देगा जिनके पास एक या एक से अधिक बच्चों classके featureListसाथ liपाठ है 'Model'


13
+1 - "" ./ "थोड़ा भ्रामक है - यह सुझाव देता है कि जब आप इसे छोड़ते हैं तो वर्तमान नोड के अलावा कुछ भी ध्यान में रखा जाएगा, लेकिन वास्तव में यह बेमानी है:" // ul [@ class = ' फ़ीचरलिस्ट 'और ली [(,', 'मॉडल')]] "एक ही बात है।
तोमलक

4
हाँ, मैं बस विशिष्ट किया जा रहा था। काफी संभवतः विशिष्ट है।
जेफ येट्स

यदि liसाथ नहीं Modelहै ul, तो andस्थिति विफल हो जाएगी। तो खाली सेट पर andस्थिति रिटर्न false, क्या यह सही है?
डमरू

58

मैंने जेफ येट्स के समाधान के लिए पहले से ही अपना +1 दिया।

यहां एक त्वरित व्याख्या है कि आपका दृष्टिकोण क्यों काम नहीं करता है। यह:

// उल [@ वर्ग = 'सुविधावादी' और (ली, 'मॉडल')]

contains()फ़ंक्शन (या उस मामले के लिए XPath में किसी अन्य स्ट्रिंग फ़ंक्शन) की सीमा का सामना करता है।

पहला तर्क एक स्ट्रिंग माना जाता है। यदि आप इसे एक नोड सूची ("यह liकरता है") देते हैं, तो स्ट्रिंग में रूपांतरण होना चाहिए। लेकिन यह रूपांतरण केवल सूची में पहले नोड के लिए किया जाता है।

आपके मामले में सूची में पहला नोड है <li><b>Type:</b> Clip Fan</li>(एक स्ट्रिंग में परिवर्तित: " Type: Clip Fan") जिसका अर्थ है कि यह:

// उल [@ वर्ग = 'सुविधावादी' और (ली, 'प्रकार')]

वास्तव में एक नोड का चयन करेंगे!


1
अच्छा यह जानने की जद्दोजहद कर रहा था कि प्रश्न क्यों: "। यकीन है कि ऊपर कैसे काम कर रहा था। जो मुझे वास्तव में चाहिए था, वह था ।//td..//* [अपरंपरागत (।, ')']]] "
जॉनी राया

11

यह XPath के बारे में एक आम गलत धारणा के बारे contains()में एक पुराने प्रश्न का एक नया उत्तर है ...

सारांश: contains()इसका मतलब है एक विकल्प , एक नोड शामिल नहीं है

विस्तृत विवरण

इस XPath को अक्सर गलत समझा जाता है:

//ul[contains(li, 'Model')]

गलत व्याख्या: उन ulतत्वों का चयन करें जिनमें इसके liसाथ एक तत्व Modelहै।

यह गलत है क्योंकि

  1. contains(x,y)xएक स्ट्रिंग होने की उम्मीद है, और
  2. कई तत्वों को स्ट्रिंग में बदलने के लिए XPath नियम यह है :

    नोड-सेट एक नोड में स्ट्रिंग नोड में स्ट्रिंग-मान में परिवर्तित करके परिवर्तित किया जाता है जो दस्तावेज़ क्रम में पहली बार होता है । यदि नोड-सेट खाली है, तो एक खाली स्ट्रिंग लौटा दी जाती है।

सही व्याख्या: उन ulतत्वों का चयन करें जिनके पहले li बच्चे के पास एक स्ट्रिंग-मूल्य है जिसमें एक विकल्प है Model

उदाहरण

एक्सएमएल

<r>
  <ul id="one">
    <li>Model A</li>
    <li>Foo</li>
  </ul>
  <ul id="two">
    <li>Foo</li>
    <li>Model A</li>
  </ul>
</r> 

XPaths

  • //ul[contains(li, 'Model')]one ulतत्व का चयन करता है।

    नोट:two ul तत्व चयनित नहीं है क्योंकि पहले की स्ट्रिंग-मूल्य liके बच्चे two ulहै Foo, जो शामिल नहीं है Model-स्ट्रिंग।

  • //ul[li[contains(.,'Model')]]oneऔर two ulतत्वों का चयन करता है ।

    नोट: दोनों ulतत्वों को चुना जाता है क्योंकि contains()प्रत्येक पर liव्यक्तिगत रूप से लागू किया जाता है। (इस प्रकार, ट्रिकी मल्टीपल-एलिमेंट-टू-स्ट्रिंग रूपांतरण नियम से बचा जाता है।) दोनों ulतत्वों में एक liबच्चा होता है, जिसके स्ट्रिंग मान में Modelप्रतिस्थापन - liतत्व की स्थिति अब मायने नहीं रखती है।

यह सभी देखें



-5

containsयहाँ मेरा उदाहरण चिपकाएँ :

//table[contains(@class, "EC_result")]/tbody

2
ओपी के कोड में कोई tableतत्व या EC_resultवर्ग मूल्य नहीं है । इस जवाब का यहां कोई मतलब नहीं है और इसे हटा दिया जाना चाहिए।
kjhughes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.