এক্সপ্যাথটিতে (পাঠ্য (), 'কিছু স্ট্রিং') থাকে যখন নোডের সাথে একাধিক পাঠ্য সাব্নোড ব্যবহার করা হয়


258

এক্সপথের সাথে আমার একটি ছোট সমস্যা রয়েছে dom4j এর সাথে ...

আমার এক্সএমএল বলতে দিন

<Home>
    <Addr>
        <Street>ABC</Street>
        <Number>5</Number>
        <Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
    </Addr>
</Home>

আসুন বলুন যে আমি সমস্ত নোডগুলিকে মূল উপাদানটি দিয়ে দেওয়া পাঠ্যে এবিসি রয়েছে সেগুলি সন্ধান করতে চাই ...

সুতরাং যে এক্সপ্যাথটি আমার লিখতে হবে তা হবে

//*[contains(text(),'ABC')]

তবে এটি ডম 4 জনের ফেরত আসে না .... এটি কি ডম 4 জ সমস্যা বা এক্সপিথ কীভাবে কাজ করে তা আমার বোঝা। যেহেতু এই ক্যোয়ারীটি কেবল স্ট্রিট এলিমেন্টকে দেয় এবং মন্তব্য উপাদান নয়।

DOM কমেন্ট এলিমেন্টকে চারটি ট্যাগ দুটি সহ একটি সংমিশ্রিত উপাদান তৈরি করে

[Text = 'XYZ'][BR][BR][Text = 'ABC'] 

আমি ধরে নেব যে ক্যোয়ারিতে এখনও উপাদানটি ফিরে আসা উচিত কারণ এটিতে উপাদানটি খুঁজে পাওয়া উচিত এবং এতে চালানো উচিত তবে এটি হয় না ... ...

নিম্নলিখিত ক্যোয়ারী উপাদানটি ফেরত দেয় তবে এটি কেবলমাত্র উপাদানটির চেয়ে অনেক বেশি ফিরে আসে, এটি পিতামাত্ত উপাদানগুলিও ফেরত দেয় ... যা সমস্যার অনাকাঙ্ক্ষিত ...

//*[contains(text(),'ABC')]

এক্সপথ ক্যোয়ারী কি কেউ জানে যা কেবলমাত্র উপাদানগুলি <Street/>এবং ফিরে আসতে পারে <Comment/>?


যতদূর আমি বলতে পারি, //*[contains(text(),'ABC')]কেবলমাত্র <Street>উপাদানটি ফেরত দেয় । এটি <Street>বা পূর্বপুরুষদের কোনও ফেরত দেয় না <Comment>
কেন ব্লুম

উত্তর:


706

<Comment>ট্যাগ দুটি টেক্সট নোড এবং দুই রয়েছে <br>শিশু যেমন নোড।

আপনার এক্সপথ এক্সপ্রেশন ছিল

//*[contains(text(),'ABC')]

এটি ভেঙে ফেলার জন্য,

  1. * কোনও নির্বাচক যা কোনও উপাদান (যেমন ট্যাগ) এর সাথে মেলে - এটি নোড-সেট দেয়।
  2. []একটি শর্তাধীন যে নোড সেটে প্রতিটি নোডের করে পরিচালিত হয়। এটি বন্ধনীর ভিতরে থাকা শর্তগুলির সাথে মিলে যদি কোনও পৃথক নোড পরিচালনা করে তবে এটি মেলে।
  3. text()প্রসঙ্গ নোডের শিশু এমন সমস্ত পাঠ্য নোডের সাথে মেলে এমন একটি নির্বাচক - এটি একটি নোড সেট দেয়।
  4. containsএকটি ফাংশন যা একটি স্ট্রিংয়ে চালিত হয়। যদি এটি নোড সেটটি পাস হয় তবে নোড সেটটি হয় নোড-সেটে নোডের স্ট্রিং-মানটি যা ডকুমেন্ট ক্রমে প্রথম হয় সেটিকে স্ট্রিংয়ে রূপান্তরিত করে । অত: পর, এটি আপনার মধ্যে শুধুমাত্র প্রথম টেক্সট নোড মেলাতে পারে <Comment>যথা - উপাদান BLAH BLAH BLAH। যেহেতু এটি মেলে না, আপনি <Comment>নিজের ফলাফলগুলিতে একটি পান না ।

আপনার এটিতে পরিবর্তন করা দরকার

//*[text()[contains(.,'ABC')]]
  1. * কোনও নির্বাচক যা কোনও উপাদান (যেমন ট্যাগ) এর সাথে মেলে - এটি নোড-সেট দেয়।
  2. বাহ্যিকটি []একটি শর্তসাপেক্ষ যা সেই নোড সেটের প্রতিটি পৃথক নোডের উপর পরিচালিত হয় - এখানে এটি নথির প্রতিটি উপাদানটিতে কাজ করে।
  3. text() ইহা একটি প্রসঙ্গ নোডের শিশু এমন সমস্ত পাঠ্য নোডের সাথে মেলে নির্বাচক - এটি একটি নোড সেট দেয়।
  4. ভিতরের [] একটি শর্তসাপেক্ষ যা সেই নোড সেটের প্রতিটি নোডের উপর পরিচালিত হয় - এখানে প্রতিটি স্বতন্ত্র পাঠ্য নোড। প্রতিটি স্বতন্ত্র পাঠ্য নোড বন্ধনীগুলির যে কোনও পাথের সূচনার পয়েন্ট এবং বন্ধনীগুলির .মধ্যে স্পষ্টরূপে উল্লেখ করা যেতে পারে । এটি বন্ধনীর ভিতরে থাকা শর্তগুলির সাথে মিলে যদি কোনও পৃথক নোড পরিচালনা করে তবে এটি মেলে।
  5. containsএকটি ফাংশন যা একটি স্ট্রিংয়ে চালিত হয়। এখানে এটি একটি পৃথক পাঠ্য নোড ( .) পাস হয়েছে । যেহেতু এটি <Comment>পৃথকভাবে ট্যাগের দ্বিতীয় পাঠ নোডটি পাস করা হয়েছে , এটি 'ABC'স্ট্রিংটি দেখতে পাবে এবং এটির সাথে এটি মিলবে।

1
একটি চমত্কার আমি একটি এক্সপথ নুব এর সামান্য বিট, সুতরাং আমাকে এটি পেতে দিন, পাঠ্য () একটি ফাংশন যা অভিব্যক্তি ধারণ করে (।, 'এবিসি'), এমন কি কোনও সুযোগ আছে যা আপনি ব্যাখ্যা করতে পারেন যাতে আমি এই ধরনের কাজ না করি বোকা স্টাফ আবার;)
মাইক মিল্কিন

28
দীর্ঘ ব্যাখ্যা দেওয়ার জন্য আমি আমার উত্তর সম্পাদনা করেছি। আমি নিজে এক্সপ্যাথ সম্পর্কে তেমন কিছুই জানি না - আমি এই সংমিশ্রণে হোঁচট খাওয়ার আগ পর্যন্ত আমি কিছুটা পরীক্ষা-নিরীক্ষা করেছি। একবার আমার একটি কাজের সংমিশ্রণ হয়ে গেলে, আমি কী অনুগ্রহ করে তা অনুমান করতে এবং এক্সপ্যাথ স্ট্যান্ডার্ডটি দেখেছিলাম যা আমার মনে হচ্ছে যা হচ্ছে তা নিশ্চিত করতে এবং ব্যাখ্যাটি লিখতে।
কেন ব্লুম

2
কীভাবে আপনি এটিকে সংবেদনশীল অনুসন্ধান করবেন?
জ্যাক

@ জ্যাক: দয়া করে এটি একটি নতুন প্রশ্ন করুন।
ব্যবহারকারী1129682

1
আমি জানি এটি একটি পুরানো থ্রেড, তবে যে কেউ মূলত পার্থক্য রয়েছে কিনা সে সম্পর্কে মন্তব্য করতে পারে, কেন ব্লুম এবং দেওয়া উত্তরের মধ্যে কয়েকটি সাধারণ পরীক্ষার ক্ষেত্রে //*[contains(., 'ABC')]। আমি মাইক মিল্কিনের দেওয়া প্যাটার্নটি সবসময় ব্যবহার করেছি, এটি আরও উপযুক্ত containsবলে মনে করে , তবে কেবলমাত্র বর্তমান প্রেক্ষাপটে করা আসলে মনে হয় যা আমি প্রায়শই চাই।
নিকটকম

7

[contains(text(),'')]শুধুমাত্র সত্য বা মিথ্যা প্রত্যাবর্তন করে। এটি কোনও উপাদান ফলাফল ফেরত দেবে না।


এই কাজটি যদি আমার '' বা '' থাকে তবে আমরা কীভাবে ছাঁটাই করব?
শরীফ

contains(text(),'JB-')কাজ না! যুক্তি হিসাবে দুটি স্ট্রিংconatains লাগে - ! পাঠ্য () স্ট্রিং নয় , এটি একটি ফাংশন! contains(**string**, **string**)
আতচিশিডো

6

এক্সএমএল ডকুমেন্ট:

<Home>
    <Addr>
        <Street>ABC</Street>
        <Number>5</Number>
        <Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
    </Addr>
</Home>

এক্সপথ এক্সপ্রেশন:

//*[contains(text(), 'ABC')]

//*মূল নোডের যে কোনও বংশধর উপাদানটির সাথে মেলে । এটি হ'ল মূল উপাদানটি ছাড়া কোনও উপাদান but

[...]এটি একটি শিকারী , এটি নোড-সেট ফিল্টার করে। এটি নোডগুলি দেয় যার ...জন্য true:

একটি প্রাক্টিকেট একটি নোড-সেট ফিল্টার করে [...] একটি নতুন নোড-সেট উত্পাদন করতে। ফিল্টার করার জন্য নোড-সেটের প্রতিটি নোডের জন্য, প্রিডিকেটএক্সপিআর মূল্যায়ন করা হয় [...]; যদি প্রিডিকেটএক্সপ্রিপ সেই নোডের জন্য সত্যকে মূল্যায়ন করে তবে নোডটি নতুন নোড-সেটে অন্তর্ভুক্ত করা হবে; অন্যথায়, এটি অন্তর্ভুক্ত করা হয় না।

contains('haystack', 'needle')ফেরৎ trueযদি haystack রয়েছে needle :

ফাংশন: বুলিয়ান রয়েছে (স্ট্রিং, স্ট্রিং)

যদি প্রথম আর্গুমেন্ট স্ট্রিংয়ে দ্বিতীয় আর্গুমেন্ট স্ট্রিং থাকে তবে এতে ফাংশনটি সত্য হয় এবং অন্যথায় মিথ্যা ফিরিয়ে দেয়।

তবে contains()তার প্রথম প্যারামিটার হিসাবে একটি স্ট্রিং নেয়। এবং এটি নোড পাস হয়েছে। প্রথম প্যারামিটার হিসাবে পাস হওয়া প্রতিটি নোড বা নোড-সেটটি কাজ করে ফাংশনটির মাধ্যমে স্ট্রিংয়ে রূপান্তরিত হবে string():

একটি আর্গুমেন্ট স্ট্রিং ফাংশন কল করে যেমন স্ট্রিং টাইপ রূপান্তরিত হয়।

string()ফাংশন আয় string-valueএর প্রথম নোড :

নোড-সেট নোড-সেটে নোডের স্ট্রিং-মানটি যা ডকুমেন্ট ক্রমে প্রথম হয় সেটিকে স্ট্রিংতে রূপান্তরিত করে। নোড-সেট খালি থাকলে একটি খালি স্ট্রিংটি ফিরে আসে।

string-valueএকটি উপাদান নোড :

উপাদান নোডের স্ট্রিং-মান হ'ল ডকুমেন্ট ক্রমে উপাদান নোডের সমস্ত পাঠ নোড বংশধরের স্ট্রিং-মানগুলির সংমিশ্রণ।

string-valueএকটি পাঠ্য নোডের :

একটি পাঠ্য নোডের স্ট্রিং-মান হ'ল অক্ষর ডেটা।

সুতরাং, মূলত string-valueসমস্ত পাঠ যা নোডে অন্তর্ভুক্ত থাকে (সমস্ত বংশধর পাঠ্য নোডের সংমিশ্রণ)।

text() কোনও নোড পরীক্ষা যা কোনও পাঠ্য নোডের সাথে মেলে:

নোড পরীক্ষার পাঠ্যটি কোনও পাঠ্য নোডের ক্ষেত্রেই সত্য। উদাহরণস্বরূপ, চাইল্ড :: টেক্সট () প্রসঙ্গ নোডের পাঠ্য নোডের শিশুদের নির্বাচন করবে।

এটি বলার পরে, //*[contains(text(), 'ABC')]কোনও উপাদানের সাথে মেলে (তবে মূল নোড), এর মধ্যে প্রথম পাঠ্য নোড রয়েছে ABC। যেহেতু text()একটি নোড-সেট দেয় যা প্রসঙ্গে নোডের সমস্ত শিশু পাঠ্য নোড (যার সাথে একটি অভিব্যক্তি মূল্যায়ন করা হয়) সরবরাহ করে relative তবে contains()প্রথমটিই নেয়। উপরের নথির জন্য পাথের সাথে মেলেStreet উপাদানটির সাথে ।

নিম্নলিখিত এক্সপ্রেশনটি //*[text()[contains(., 'ABC')]]কোনও উপাদানের সাথে মেলে (তবে মূল নোড), এতে অন্তত একটি শিশু পাঠ নোড রয়েছে ABC.প্রসঙ্গ নোড উপস্থাপন করে। এই ক্ষেত্রে, এটি কোনও উপাদানগুলির চাইল্ড টেক্সট নোড তবে মূল নোড। সুতরাং উপরের নথির জন্য পথটি মেলে Street, এবংComment উপাদানগুলির সাথে ।

তারপরে এখন, //*[contains(., 'ABC')]কোনও উপাদান (তবে মূল নোড) এর সাথে মেলে যা ABC(বংশোদ্ভূত পাঠ্য নোডের সংমিশ্রণে ) ধারণ করে। ডকুমেন্ট উপরে এটা মিলের জন্য Home, Addr, Street, এবং Commentউপাদান। যেমনটি , দ্য , এবং উপাদানগুলির সাথে //*[contains(., 'BLAH ABC')]মেলে ।HomeAddrComment


0

এটি আমাকে কিছুটা সময় নিয়েছিল তবে অবশেষে বের হয়ে গেল। নীচে কিছু পাঠ্য রয়েছে এমন কাস্টম এক্সপথটি আমার জন্য নিখুঁতভাবে কাজ করেছে।

//a[contains(text(),'JB-')]

2
contains(text(),'JB-')কাজ না! যুক্তি হিসাবে দুটি স্ট্রিংconatains লাগে - ! পাঠ্য () স্ট্রিং নয় , এটি একটি ফাংশন! contains(**string**, **string**)
আতচিশিডো

0

গৃহীত উত্তরটি সমস্ত পিতামাতার নোডকেও ফিরিয়ে দেবে। স্ট্রিংটি পরে থাকলেও কেবলমাত্র এবিসি সহ প্রকৃত নোডগুলি পেতে
:

//*[text()[contains(.,'ABC')]]/text()[contains(.,"ABC")]

0
//*[text()='ABC'] 

আয়

<street>ABC</street>
<comment>BLAH BLAH BLAH <br><br>ABC</comment>

3
পাঁচটি বিদ্যমান উত্তরের সাথে নয় বছরের পুরানো প্রশ্নের উত্তর যুক্ত করার সময় আপনার উত্তরটির প্রশ্নের কোন অনন্য নতুন দিকটি সম্বোধন করা খুব গুরুত্বপূর্ণ।
জেসন অ্যালার

উত্তর আমি পোস্ট খুব সহজ ছিল। তাই ভাগ করে নেওয়ার মতো ভেবেছিলেন, যা আমার মতো নতুনদের সহায়তা করতে পারে।
ব্যবহারকারী 3520544
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.