নোডগুলি পান যেখানে শিশু নোডে একটি বৈশিষ্ট্য রয়েছে


116

ধরুন আমার কাছে নিম্নলিখিত এক্সএমএল রয়েছে:

<book category="CLASSICS">
  <title lang="it">Purgatorio</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CLASSICS">
  <title lang="it">Inferno</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

আমি এমন একটি এক্সপ্যাথ করতে চাই যা সমস্ত বই নোডগুলিতে ফিরে আসে যেখানে "এটি" এর ভাষা বৈশিষ্ট্যের সাথে একটি শিরোনাম নোড রয়েছে।

আমার প্রচেষ্টায় এরকম কিছু লাগছিল:

//book[title[@lang='it']]

তবে তা কার্যকর হয়নি। আমি নোডগুলি ফিরে পেতে আশা করি:

<book category="CLASSICS">
  <title lang="it">Purgatorio</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

<book category="CLASSICS">
  <title lang="it">Inferno</title>
  <author>Dante Alighieri</author>
  <year>1308</year>
  <price>30.00</price>
</book>

কোন ইঙ্গিত?


এটি এক্সপথ বাস্তবায়ন কী?
পাভেল মিনায়েভ

উত্তর:


175

চেষ্টা

//book[title/@lang = 'it']

এটি পড়ে:

  • সমস্ত bookউপাদান পেতে
    • যে কমপক্ষে একটি আছে title
      • যার একটি বৈশিষ্ট্য রয়েছে lang
        • একটি মান সহ "it"

আপনি খুঁজে পেতে পারেন এই সহায়ক - এটা একটি নিবন্ধ এনটাইটেলমেন্টসহ এর "পাঁচ অনুচ্ছেদে জন্য XPath" রোনাল্ড Bourret দ্বারা।

তবে সমস্ত সততার সাথে //book[title[@lang='it']]এবং উপরেরটির সমতুল্য হওয়া উচিত, যদি না আপনার এক্সপ্যাথ ইঞ্জিনটিতে "সমস্যা" থাকে। সুতরাং কোড বা নমুনা এক্সএমএলে এটি এমন কিছু হতে পারে যা আপনি আমাদের প্রদর্শন করছেন না - উদাহরণস্বরূপ, আপনার নমুনাটি একটি এক্সএমএল খণ্ড। এটি কি এমন হতে পারে যে মূল উপাদানটির একটি নেমস্পেস রয়েছে এবং আপনি আপনার অনুসন্ধানের জন্য এটি গণনা করছেন না? এবং আপনি কেবল আমাদের বলেছিলেন যে এটি কার্যকর হয়নি, তবে আপনি কী ফলাফল পেয়েছেন তা আমাদের জানাননি।


4
যদি titleসরাসরি সন্তান না হয় তবে এটি আরও কীভাবে করা যায় bookতবে কোথাও আরও গভীরতর এবং আমরা ঠিক কোথায় জানি না? //book[/title/@lang = 'it']কাজ বলে মনে হচ্ছে না?
মার্টিন কোনিসেক

5
মার্টিন, আপনি //booksel.//title/@lang = 'it'] ব্যবহার করতে পারেন। আমি বিশ্বাস করি কৌশলটি ""। শর্তের শুরুতে।
ব্রুনো কপোনি

1
লিঙ্কের জন্য ধন্যবাদ, চমৎকার নিবন্ধ। আমি বছরের পর বছর ধরে এক্সপথ ব্যবহার করছি তবে এটি সত্যই আমাকে অন্তর্নিহিত যুক্তি বুঝতে সহায়তা করেছে!
সোয়েন্সার

57

বছর পরে, তবে একটি কার্যকর বিকল্পটি এক্সপথ অ্যাক্সেস ( https://www.w3schools.com/xML/xpath_axes.asp ) ব্যবহার করা হবে । আরও সুনির্দিষ্টভাবে, আপনি বংশধরদের অক্ষ ব্যবহার করতে চাইছেন ।

আমি বিশ্বাস করি এই উদাহরণটি কৌশলটি করবে:

//book[descendant::title[@lang='it']]

এটি আপনাকে এমন সমস্ত bookউপাদান বাছাই করতে সহায়তা করে যা কোনও শিশু titleউপাদানকে (এটি যত গভীরভাবে নির্বিশেষে নির্বিশেষে) ভাষা এর গুণাবলী 'এটির' সমান সমন্বিত থাকে।

এই উত্তরটি ২০০৯ সালের সাথে প্রাসঙ্গিক কিনা তা আমি নিশ্চিত করে বলতে পারি না কারণ আমি এক্সপ্যাথ অ্যাক্সেসের অস্তিত্বের 100% নিশ্চিত নই। আমি যা নিশ্চিত করতে পারি তা হ'ল এগুলির উপস্থিতি আজই রয়েছে এবং আমি এগুলিকে এক্সপ্যাথ নেভিগেশনে অত্যন্ত দরকারী বলে খুঁজে পেয়েছি এবং আমিও নিশ্চিত যে আপনিও তা করবেন।


12
//book[title[@lang='it']]

আসলে সমতুল্য

 //book[title/@lang = 'it']

আমি ভিটিডি-এক্সএমএল ব্যবহার করে চেষ্টা করেছি, উভয় এক্সপ্রেশন একই ফলাফলকে থুথু দিয়েছে ... আপনি কোন এক্সপথ প্রসেসিং ইঞ্জিন ব্যবহার করেছেন? আমার ধারণা এটির নীচে কোডটি কনফারেন্স ইস্যু রয়েছে

import com.ximpleware.*;
public class test1 {
  public static void main(String[] s) throws Exception{
      VTDGen vg = new VTDGen();
      if (vg.parseFile("c:/books.xml", true)){
          VTDNav vn = vg.getNav();
          AutoPilot ap = new AutoPilot(vn);
          ap.selectXPath("//book[title[@lang='it']]");
                  //ap.selectXPath("//book[title/@lang='it']");

          int i;
          while((i=ap.evalXPath())!=-1){
              System.out.println("index ==>"+i);
          }
          /*if (vn.endsWith(i, "< test")){
             System.out.println(" good ");  
          }else
              System.out.println(" bad ");*/

      }
  }
}

এটি পছন্দসই সমস্যা এবং এটির সিনট্যাক্স একই নোডেট তৈরি করে +1 + সি # তেও একই কোড ব্যবহার করে।
জাচ বনহাম

-1: মিঃ জাং, আমি প্রশ্নের সাথে প্রাসঙ্গিক নয় এমন কোডগুলি সরিয়ে দিয়ে আপনার পক্ষে চেষ্টা করার চেষ্টা করছিলাম। এটি আমাকে আপনাকে নীচে নামতে দেয়নি, যা এখন আমার মনে হচ্ছে আমার করতে হবে। মনে রাখবেন যে কোয়েরিতে কল করার জন্য অন্য কোনও উত্তরে কোড অন্তর্ভুক্ত নয়।
জন স্যান্ডার্স

6
+1: কারণ মিঃ সান্ডার্স কী সম্পর্কে কথা বলছেন তা আমি বুঝতে পারি না - অন্য কোনও উত্তর কোনও কোড যুক্ত করেছে না, এবং এই উত্তরটি কোডটি ব্যবহার করে যাতে আমরা 1: তার পদ্ধতিগুলি যাচাই করতে পারি এবং 2: নিজের পরীক্ষাটি নিজেই সম্পাদন করতে পারি। কোডটি সংক্ষিপ্ত এবং পড়তে সহজ। সমস্যা দেখছি না।
ডাকপ্পি

4

আমি মনে করি আপনার নিজের পরামর্শটি সঠিক, তবে এক্সএমএলটি বেশ কার্যকর নয়। আপনি চালান তাহলে //book[title[@lang='it']]উপর <root>[Your"XML"Here]</root>তারপর বিনামূল্যে অনলাইন প্রদত্ত xPath পরীক্ষকগণ যেমন এক এখানে প্রত্যাশিত ফলাফলের পাবেন।


2

এই এক্সপথ এক্সপ্রেশনটি ব্যবহার করার চেষ্টা করুন:

//book/title[@lang='it']/..

এটি আপনাকে "এটি" ল্যাং-এ সমস্ত বইয়ের নোড দেয়


2
এই অভিব্যক্তির ফলাফল শিরোনাম নোডগুলি নয়, বইয়ের নোডগুলি
ক্যালথ

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