नोड्स प्राप्त करें जहां बाल नोड में एक विशेषता है


116

मान लीजिए कि मेरे पास निम्नलिखित XML है:

<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>

मैं एक xpath करना चाहूंगा जिसे सभी पुस्तक नोड्स वापस मिलें जिनके पास "इट" की भाषा विशेषता के साथ एक शीर्षक नोड है।

मेरी कोशिश कुछ इस तरह दिखी:

//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>

कोई संकेत?


XPath क्या है?
पावेल मिनेव

जवाबों:


175

प्रयत्न

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

यह पढ़ता है:

  • सभी bookतत्व प्राप्त करें
    • कि कम से कम एक है title
      • जिसकी एक विशेषता है lang
        • के मान से "it"

आपको यह मददगार लग सकता है - यह एक लेख है जिसका शीर्षक "XPath in Five Paragraphs" है।

लेकिन सभी ईमानदारी में, //book[title[@lang='it']]और ऊपर बराबर होना चाहिए, जब तक कि आपके XPath इंजन में "मुद्दे" न हों। तो यह कोड या नमूना XML में कुछ हो सकता है जो आप हमें नहीं दिखा रहे हैं - उदाहरण के लिए, आपका नमूना एक XML टुकड़ा है। क्या यह हो सकता है कि मूल तत्व में एक नाम स्थान है, और आप अपनी क्वेरी में उसके लिए गिनती नहीं कर रहे हैं? और आपने केवल हमें बताया कि यह काम नहीं किया, लेकिन आपने हमें नहीं बताया कि आपको क्या परिणाम मिले।


4
यदि titleकोई प्रत्यक्ष बच्चा नहीं है, तो इसे कैसे करें book, लेकिन कहीं गहरा और हमें नहीं पता कि वास्तव में कहां है? //book[/title/@lang = 'it']काम करने के लिए प्रतीत नहीं होता?
मार्टिन कोनिसक

5
मार्टिन, आप //book J..//title/@lang = 'it'] का उपयोग कर सकते हैं। मेरा मानना ​​है कि चाल "है।" हालत की शुरुआत में।
ब्रूनो कैपोनी

1
लिंक के लिए धन्यवाद, उत्कृष्ट लेख। मैं वर्षों से xPath का उपयोग कर रहा हूं, लेकिन इससे मुझे अंतर्निहित तर्क समझने में मदद मिली!
स्वेन्सर

57

वर्षों बाद, लेकिन एक उपयोगी विकल्प XPath Axes ( https://www.w3schools.com/xml/xpath_axes.asp ) का उपयोग करना होगा । अधिक विशेष रूप से, आप वंशज कुल्हाड़ियों का उपयोग करना चाह रहे हैं।

मुझे विश्वास है कि यह उदाहरण चाल करेगा:

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

यह आपको उन सभी bookतत्वों का चयन करने की अनुमति देता है, जिनमें बाल titleतत्व होता है (चाहे वह कितना भी नेस्टेड क्यों न हो) जिसमें भाषा विशेषता मान all इट ’के बराबर होता है।

मैं यह सुनिश्चित करने के लिए नहीं कह सकता कि यह उत्तर वर्ष 2009 के लिए प्रासंगिक है या नहीं क्योंकि मैं 100% निश्चित नहीं हूं कि उस समय एक्सपीथ एक्सिस मौजूद था। मैं क्या पुष्टि कर सकता हूं कि वे आज भी मौजूद हैं और मैंने उन्हें XPath नेविगेशन में बेहद उपयोगी पाया है और मुझे यकीन है कि आप भी होंगे।


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

वास्तव में इसके बराबर है

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

मैंने vtd-xml का उपयोग करके इसे आज़माया, दोनों अभिव्यक्तियों ने एक ही परिणाम निकाला ... क्या xpath प्रसंस्करण इंजन का उपयोग किया था? मुझे लगता है कि यह अनुरूपता मुद्दा है नीचे कोड है

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 यह कि इसका अनुपालन मुद्दा है और वाक्य रचना एक ही नोडसेट बनाता है। C # में समान कोड भी काम करता है।
जैच बोन्हम

-1: श्री झांग, मैं आपको प्रश्न से प्रासंगिक कोड हटाकर आपका पक्ष लेने की कोशिश कर रहा था। इसने मुझे आपको नीचा दिखाने की अनुमति नहीं दी, जो अब मुझे लगता है कि मुझे करना होगा। ध्यान दें कि किसी अन्य उत्तर में कॉल को कॉल करने के लिए कोड शामिल नहीं है।
जॉन सॉन्डर्स

6
+1: क्योंकि मैं यह पता नहीं लगा सकता कि श्री सॉन्डर्स किस बारे में बात कर रहे हैं - कोई अन्य उत्तर किसी भी कोड को नहीं जोड़ा गया है, और यह उत्तर उस कोड का उपयोग करता है जिससे हम 1: उसके तरीकों को मान्य कर सकते हैं और 2: उसका परीक्षण स्वयं करें। कोड छोटा और पढ़ने में आसान है। मुझे समस्या नहीं दिख रही है।
डकपॉपी 20

4

मुझे लगता है कि आपका अपना सुझाव सही है, हालाँकि xml काफी मान्य नहीं है। आपके द्वारा चलाए जा रहे हैं, तो //book[title[@lang='it']]पर <root>[Your"XML"Here]</root>तो मुफ्त ऑनलाइन xPath परीक्षकों जैसे एक यहाँ अपेक्षित परिणाम मिल जाएगा।


2

इस xPath अभिव्यक्ति का उपयोग करने का प्रयास करें:

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

आपको "इट" लैंग में सभी बुक नोड्स देने चाहिए


2
उस अभिव्यक्ति का परिणाम शीर्षक नोड्स है, न कि पुस्तक नोड्स
केलथ

2
वह सत्य नहीं है। यह बुक नोड्स लौटाएगा (अंत में ये दो डॉट्स शीर्षक नोड के ऊपरी नोड पर लक्षित हैं)।
user1113000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.