XPath का उपयोग करके विशेषता प्राप्त करना


344

एक XML संरचना को देखते हुए ऐसा है:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

प्रथम तत्व के लिए मुझे lang( पुस्तक शीर्षक में कहां) langका मूल्य मिल सकता है eng?


2
बहुत अच्छा लिंक जब xpaths का उपयोग कर test-able.blogspot.ie/2016/04/xpath-selectors-cheat-sheet.html

जवाबों:


472

मैं प्रथम तत्व के लिए लैंग (जहाँ पुस्तक शीर्षक में lang = eng) का मूल्य कैसे प्राप्त कर सकता हूं?

उपयोग करें :

/*/book[1]/title/@lang

इसका मतलब है :

langशीर्षक तत्व की विशेषता का चयन करें जो bookXML दस्तावेज़ के शीर्ष तत्व के पहले बच्चे का बच्चा है।

इस विशेषता का केवल स्ट्रिंग मान प्राप्त करने के लिए मानक XPath फ़ंक्शन का उपयोग करेंstring() :

string(/*/book[1]/title/@lang)

3
@AbhishekAsthana, XPath अभिव्यक्ति का मूल्यांकन करने का परिणाम langविशेषता के स्ट्रिंग मान का उत्पादन करता है । यदि विशेषता में कोई वर्ग ब्रैकेट नहीं है, तो वे XPath अभिव्यक्ति के मूल्यांकन के परिणाम का हिस्सा नहीं होंगे। मेरा अनुमान है कि ये आपके द्वारा उपयोग किए जा रहे एक (अनुपयुक्त) उपकरण द्वारा जोड़े गए हैं।
दिमित्रे नोवाचेव

6
हाँ, मैं इस समस्या का पता लगा रहा हूँ..बस यह है कि साबुनूआई इसे कैसे प्रदर्शित करता है लेकिन जब मैं xathath मान का उपयोग करता हूं तो उन कोष्ठक का उपयोग नहीं किया जाता है। मैंने इसे बहुत बार देखा है। समस्या टूल..किट और कीबोर्ड के बीच नहीं है।
अभिषेक अस्थाना

4
@KorayTugay, XPath अभिव्यक्ति 0 या अधिक विशेषता नोड्स के नोड-सेट का /*/book[1]/title/@lang चयन करती है, जबकि string(/*/book[1]/title/@lang)मूल्यांकन किए जाने पर XPath अभिव्यक्ति इस नोड-सेट के स्ट्रिंग मान का उत्पादन करती है - और यह पहले (दस्तावेज़ क्रम में) का स्ट्रिंग मान है नोड इस नोड-सेट से।
दिमित्रे नोवत्चेव

4
@KorayTugay, नहीं, पहली अभिव्यक्ति का चयन करता है , "वापसी" नहीं करता है - नोड्स का एक सेट, और नोड्स का यह सेट एक स्ट्रिंग नहीं है। एक नोड एक स्ट्रिंग नहीं है - एक नोड एक पेड़ में एक नोड है । एक XML दस्तावेज़ नोड्स का एक पेड़ है। lang="eng"एक विशेषता नोड के कई शाब्दिक निरूपणों में से एक है, जिसका एक नाम "लैंग" है, एक नेमस्पेस से संबंधित नहीं है, और एक स्ट्रिंग मान स्ट्रिंग "eng" है
डिमिट्रे नोवाचेव

1
@ व्लादिमीर, अगर v एक नेमस्पेस- uri से मेल खाता है: "my: vvv", तो कोई XPath इंजन के होस्ट में बना सकता है जिसका उपयोग मैपिंग myPrefix (हो सकता है v / जरूरी नहीं) के समान नामस्थान से हो। -यूरी "my: vvv"। और फिर विशेषता का उपयोग करके चुना जाएगा: शीर्षक / @ myPrefix: lang। इस तरह की मैपिंग कैसे बनाई जाती है, कार्यान्वयन-विशिष्ट है और किसी को XPath इंजन के होस्ट के प्रलेखन में पढ़ना होगा। यह .NET में एक विशिष्ट तरीके से किया जाता है और दूसरे तरीके से सैक्सन में कहा जाता है। यदि आपके पास ऐसी कोई मैपिंग नहीं है, तो उपयोग करें: शीर्षक / @ * [नाम () = 'v: lang']
दिमित्रे नोवाचेव

47

धन्यवाद! यह एक समान समस्या का समाधान करता है जो मेरे पास डिव के अंदर एक डेटा विशेषता के साथ था।

<div id="prop_sample" data-want="data I want">data I do not want</div>

इस xpath का उपयोग करें: //*[@id="prop_sample"]/@data-want

मनाइए कि यह किसी और के लिए सहायक हो!


6

आप xPath पैटर्न के नीचे कोशिश कर सकते हैं,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")

5
यह किसी भी XML शीर्षक तत्व के तहत / किताबों की दुकान / पुस्तक का चयन करेगा, जिसमें मूल्य संलग्नक के साथ एक लैंग एट्रीब्यूट है, न कि लैंग का मूल्य। अर्थात यह तत्वों की एक सूची का चयन करता है, एक भी गुण नहीं
JFK

2

आप इसे करके भी प्राप्त कर सकते हैं

string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

यद्यपि यदि आप जावास्क्रिप्ट के साथ XMLDOM का उपयोग कर रहे हैं तो आप कुछ ऐसा कोड कर सकते हैं

var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

और n1.textआपको मूल्य देगा"eng"


2

आप उपयोग कर सकते हैं:

(//@lang)[1]

इसका मतलब है कि आपको "लैंग" के बराबर नाम वाले सभी गुण नोड मिलते हैं और पहले वाले को मिलते हैं।


0

यहां XPath और VTD-XML के साथ "लैंग" की विशेषता मान प्राप्त करने का स्निपेट है।

import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/bookstore/book/title/@lang");
        System.out.println(" lang's value is ===>"+ap.evalXPathToString());
    }
}

0

यदि आप PostgreSQL का उपयोग कर रहे हैं, तो इसे प्राप्त करने का सही तरीका है। यह केवल एक धारणा है जहां आपके पास आबादी वाले डेटा के साथ एक पुस्तक तालिका TITLE और PRICE कॉलम है। यहाँ क्वेरी है

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.