এখানে এক্সপ্যাথ রয়েছে () কীভাবে ব্যবহার করবেন?


142

আমি এক্সপথ শিখার চেষ্টা করছি। আমি 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>
...

এটি আমার পক্ষে কাজ করে, আমি এটি হোয়াইটবিয়াম.আর.আলিবেরি
মিহি

উত্তর:


199

আপনি liযে প্রশ্নের liমধ্যে পাঠ্য থাকতে পারে এমন কোনও শিশু উপাদান অনুসন্ধান করার পরিবর্তে কেবলমাত্র প্রথম সন্তানের দিকে তাকিয়ে আছেন 'Model'। আপনার যা প্রয়োজন তা হ'ল নীচের মত একটি কোয়েরি:

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

এই প্রশ্নের সাথে আপনি উপাদান আছে একটি দেব classএর featureListএক বা একাধিক সঙ্গে li, শিশু যে টেক্সট ধারণ 'Model'


13
+1 - "./" কিছুটা বিভ্রান্তিকর - এটি পরামর্শ দেয় যে বর্তমান নোড ব্যতীত অন্য কোনও কিছু আপনি এটিকে ছেড়ে দিলে বিবেচনা করা হবে, তবে বাস্তবে এটি অপ্রয়োজনীয়: "// উল [@ শ্রেণি = ' বৈশিষ্ট্য তালিকা এবং লি [এতে (।, 'মডেল') রয়েছে]] "একই জিনিস।
টমলক

4
হ্যাঁ, আমি সুনির্দিষ্ট ছিলাম। বেশ সম্ভবত অতিরিক্ত মাত্রায় নির্দিষ্ট।
জেফ ইয়েটস

যদি liসাথে Modelনা থাকে ulতবে andশর্তটি ব্যর্থ হবে। সুতরাং andশর্ত আয় falseফাঁকা সেট, এটি সঠিক?
দামালুয়ার

58

আমি ইতিমধ্যে জেফ ইয়েটসের সমাধানটিকে আমার +1 দিয়েছি।

আপনার পদ্ধতি কেন কাজ করে না তা এখানে একটি দ্রুত ব্যাখ্যা। এই:

// উল [@ ক্লাস = 'ফিচারলিস্ট' এবং এতে রয়েছে (লি, 'মডেল')]

contains()ফাংশনটির সীমাবদ্ধতার মুখোমুখি হয় (বা এ ক্ষেত্রে এক্সপ্যাথের কোনও স্ট্রিং ফাংশন)।

প্রথম যুক্তিটি একটি স্ট্রিং বলে মনে করা হচ্ছে। আপনি যদি এটিকে নোডের তালিকা খাওয়ান (এটি দিয়ে দেয় " li) তবে স্ট্রিংয়ে রূপান্তর অবশ্যই ঘটবে। তবে এই রূপান্তরটি কেবল তালিকার প্রথম নোডের জন্য করা হয়।

আপনার ক্ষেত্রে তালিকার প্রথম নোড <li><b>Type:</b> Clip Fan</li>(একটি স্ট্রিংয়ে রূপান্তর করা হয়েছে: " Type: Clip Fan") যার অর্থ এটি:

// উল [@ ক্লাস = 'ফিচারলিস্ট' এবং এতে রয়েছে (লি, 'প্রকার')]

আসলে একটি নোড নির্বাচন করবে!


1
প্রশ্নগুলির মতো প্রশ্নের কারণগুলি খুঁজে বের করতে খুব ভাল লাগছিল: "। উপরেরটি কীভাবে কাজ করছিল তা নিশ্চিত। কি আমি আসলে প্রয়োজন ".//td[.//*[contains(.,'something ')]]" ছিল
JonnyRaa

11

এক্সপ্যাথের একটি সাধারণ ভ্রান্ত ধারণা সম্পর্কে contains()এটি একটি পুরানো প্রশ্নের নতুন উত্তর ...

সংক্ষিপ্তসার: contains()মানে একটি সাবস্ট্রিং থাকে , এতে নোড থাকে না

বিস্তারিত ব্যাখ্যা

এই এক্সপথটি প্রায়শই ভুল ব্যাখ্যা করা হয়:

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

ভুল ব্যাখ্যা: সেই ulউপাদানগুলিকে নির্বাচন করুন যাতে এটিতে একটি উপাদান থাকেliModel

এটি ভুল কারণ

  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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.