XPath: उनके मूल्य के आधार पर तत्वों का चयन कैसे करें?


221

मैं XPath का उपयोग करने के लिए नया हूं और यह एक मूल प्रश्न हो सकता है। कृपया मेरे साथ रहें और मुद्दे को सुलझाने में मेरी मदद करें। मेरे पास इस तरह की एक XML फ़ाइल है:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

मैं <Element>टैग की उपस्थिति को मान्य कर सकता हूं :

// तत्व [@ विशेषता 1 = "एबीसी" और @ विशेषता 2 = "xyz"]

अब मैं स्ट्रिंग के लिए टैग का मूल्य भी जांचना चाहता हूं "Data"। इसे प्राप्त करने के लिए मुझे उपयोग करने के लिए कहा गया था:

// तत्व [@ विशेषता 1 = "एबीसी" और @ विशेषता 2 = "xyz" और डेटा]

जब मैं बाद की अभिव्यक्ति का उपयोग करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

अभिकथन विफलता संदेश: कोई नोड्स मेल नहीं खाते //Element[@attribute1="abc" and @attribute2="xyz" and Data]

कृपया अपनी सलाह मुझे प्रदान करें कि मैंने जो XPath अभिव्यक्ति का उपयोग किया है वह वैध है या नहीं। यदि नहीं, तो मान्य XPath अभिव्यक्ति क्या होगी?

जवाबों:


329

नीचे की स्थिति:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

तत्व के भीतर तत्व डेटा के अस्तित्व के लिए जाँच करता है और तत्व मूल्य डेटा के लिए नहीं।

इसके बजाय आप उपयोग कर सकते हैं

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

मैं इस जवाब को जोड़ने का कारण यह है कि मैं .और के संबंधों को समझाना चाहता हूं text()

उपयोग करते समय पहली बात यह है कि []केवल दो प्रकार के डेटा हैं:

  1. [number] नोड-सेट से नोड का चयन करने के लिए
  2. [bool] नोड-सेट को नोड-सेट से फ़िल्टर करने के लिए

इस मामले में, मूल्य का मूल्यांकन कार्य द्वारा बूलियन के लिए किया जाता है boolean(), और एक नियम है:

फिल्टर हमेशा एक संदर्भ के संबंध में मूल्यांकन किया जाता है।

जब आप तुलना करने की आवश्यकता text()या .एक माला के साथ "Data", यह पहली उपयोग करता string()समारोह स्ट्रिंग प्रकार के लिए उन को बदलने के लिए, एक बूलियन परिणाम हो जाता है की तुलना में।

इसके बारे में दो महत्वपूर्ण नियम हैं string():

  1. string()समारोह नोड सेट में प्रथम नोड है, जो कुछ मामलों में अप्रत्याशित परिणाम उपज सकता है की स्ट्रिंग मान प्रत्यावर्तित करके स्ट्रिंग के लिए एक नोड-सेट बदल देता है।

    text()सापेक्ष पथ है जो एक नोड-सेट को लौटाता है जिसमें वर्तमान नोड (संदर्भ नोड) के सभी टेक्स्ट नोड होते हैं, जैसे ["Data"]। जब इसका मूल्यांकन किया जाता है string(["Data"]), तो यह नोड-सेट का पहला नोड लौटाएगा, इसलिए आपको "डेटा" केवल तभी मिलेगा जब नोड-सेट में केवल एक टेक्स्ट नोड हो।

  2. यदि आप चाहते हैं कि string()फ़ंक्शन सभी बाल पाठ को संक्षिप्त कर दे, तो आपको नोड-सेट के बजाय एकल नोड पास करना होगा।

    उदाहरण के लिए, हमें एक नोड-सेट मिलता है ['a', 'b'], आप वहां अभिभावक नोड को पास कर सकते हैं string(parent), यह वापस आ जाएगा 'ab', और string(.)आपके मामले में कारण एक संक्षिप्त स्ट्रिंग लौटाएगा "Data"

दोनों तरह से एक ही परिणाम प्राप्त होगा जब एक पाठ नोड हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.