XPath: बच्चे के नोड से मूल नोड प्राप्त करें


157

मुझे बच्चे के नोड के लिए मूल नोड प्राप्त करने की आवश्यकता है title 50

फिलहाल मैं केवल उपयोग कर रहा हूं

//*[title="50"]

मैं इसका जनक कैसे प्राप्त कर सकता हूं? परिणाम storeनोड होना चाहिए ।


<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
    <store d:mi="22">
        <book price="12.99" d:price="Number" d:mi="4">
            <title d:constr="String" d:mi="1">Sword of Honour</title>
            <category d:constr="String" d:mi="2">fiction</category>
            <author d:constr="String" d:mi="3">Evelyn Waugh</author>
        </book>
        <book price="8.99" d:price="Number" d:mi="9">
            <title d:constr="String" d:mi="5">Moby Dick</title>
            <category d:constr="String" d:mi="6">fiction</category>
            <author d:constr="String" d:mi="7">Herman Melville</author>
            <isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
        </book>
        <book price="8.95" d:price="Number" d:mi="13">
            <title d:constr="String" d:mi="10">50</title>
            <category d:constr="String" d:mi="11">reference</category>
            <author d:constr="String" d:mi="12">Nigel Rees</author>
        </book>
        <book price="22.99" d:price="Number" d:mi="18">
            <title d:constr="String" d:mi="14">The Lord of the Rings</title>
            <category d:constr="String" d:mi="15">fiction</category>
            <author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
            <isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
        </book>
        <bicycle price="19.95" d:price="Number" d:mi="21">
            <brand d:constr="String" d:mi="19">Cannondale</brand>
            <color d:constr="String" d:mi="20">red</color>
        </bicycle>
    </store>
</d:data>

जवाबों:


295

मूल नोड के नाम के साथ parentकुल्हाड़ियों का उपयोग करें ।

//*[title="50"]/parent::store

यह XPath केवल मूल नोड का चयन करेगा यदि यह एक है store

लेकिन आप इनमें से किसी एक का भी उपयोग कर सकते हैं

//*[title="50"]/parent::*
//*[title="50"]/..

ये xpaths किसी भी मूल नोड का चयन करेंगे। इसलिए यदि दस्तावेज़ बदलता है, तो आप हमेशा एक नोड का चयन करेंगे, भले ही यह वह नोड न हो जिसकी आप अपेक्षा करते हैं।

संपादित करें

दिए गए उदाहरण में क्या होता है जहां माता-पिता एक साइकिल है, लेकिन माता-पिता का बच्चा एक दुकान है?

क्या यह चढ़ाई करता है?

नहीं, यह केवल स्टोर का चयन करता है यदि यह नोड के माता-पिता से मेल खाता है //*[title="50"]

यदि नहीं, तो क्या ऐसे मामलों में आरोहण करने की कोई विधि है और यदि कोई माता-पिता नहीं है तो वापस लौटाएं?

हां, आप ancestorकुल्हाड़ियों का उपयोग कर सकते हैं

//*[title="50"]/ancestor::store

यह नोड के सभी पूर्वजों का चयन करेगा //*[title="50"]जो `स्टोर 'हैं। उदाहरण के लिए

<data xmlns:d="defiant-namespace" d:mi="23">
    <store mi="1">
        <store mi="22">
            <book price="8.95" d:price="Number" d:mi="13">
                <title d:constr="String" d:mi="10">50</title>
                <category d:constr="String" d:mi="11">reference</category>
                <author d:constr="String" d:mi="12">Nigel Rees</author>
            </book>
        </store>
    </store>
</data>

XPath चयन परिणाम


7
तुम भी इस्तेमाल कर सकते हैं parent::*संक्षिप्त वाक्य रचना ..: (उदाहरण //*[title="50"]/..: या एक नेस्टेड विधेय (उदाहरण) //*[*[title="50"]])
डैनियल हेली

1
अतिरिक्त जानकारी: w3.org/TR/xpath/#axes और w3.org/TR/xpath/#path-abbrev
डैनियल हेली

3
या parent::node()जो शॉर्टकट से मेल खाता है ..और मेरी राय में बेहतर है। वास्तव parent::*में प्रिंसिपल नोड प्रकार के अक्ष तक सीमित है जो ज्यादातर मामलों में एक समस्या नहीं है।
लुडोविक क्रूट

3
यदि आप कोशिश कर रहे हैं .xpath('..')याxpath('parent::node()')
briankip

"यह XPath केवल मूल नोड का चयन करेगा यदि यह एक स्टोर है।" - और दिए गए उदाहरण में क्या होता है, जहां माता-पिता हैं, bicycleलेकिन माता-पिता की संतान क्या है store? क्या यह चढ़ाई करता है? यदि नहीं, तो क्या ऐसे मामलों में आरोहण करने की कोई विधि है और Noneयदि ऐसा कोई अभिभावक नहीं है तो वापस लौटें ?
मार्टिन थोमा

31

एक विकल्प के रूप में, आप उपयोग कर सकते हैं ancestor

//*[title="50"]/ancestor::store

यह अधिक शक्तिशाली है parentक्योंकि यह दादा दादी या महान महान दादा दादी भी प्राप्त कर सकता है


20
यह "अधिक शक्तिशाली" नहीं है। यह सिर्फ अलग है। इस प्रकार अक्ष का चुनाव उपयोग के मामले पर निर्भर करता है।
लुडोविक क्रूट

11

आप अभिव्यक्ति के अंत में भी दो डॉट्स का उपयोग कर सकते हैं। इस उदाहरण को देखें:

//*[title="50"]/..

2

एक पुराने, अक्सर पूछे जाने वाले प्रश्न का नया, बेहतर उत्तर ...

मैं इसका जनक कैसे प्राप्त कर सकता हूं? परिणाम storeनोड होना चाहिए ।

parent::या ancestor::अक्ष के बजाय एक विधेय का उपयोग करें

यहां अधिकांश उत्तर titleलक्षित माता-पिता या पूर्वज ( store) तत्व तक का चयन करते हैं। एक सरल, प्रत्यक्ष दृष्टिकोण पहली जगह में माता-पिता या पूर्वज तत्व का चयन करना है, जो parent::किसी ancestor::कुल्हाड़ी या कुल्हाड़ी को पार करने की आवश्यकता को पूरा करता है :

//*[book/title = "50"]

क्या हस्तक्षेप करने वाले तत्व नाम में भिन्न होने चाहिए:

//*[*/title = "50"]

या, नाम और गहराई में:

//*[.//title = "50"]

इस सवाल का जवाब नहीं है। लेखक समय से पहले मूल नाम नहीं जानता है।
केएन सेबेस्टा

1
@KennSebesta: मैंने आपकी चिंता का समाधान करने के लिए उत्तर अपडेट किया है। कृपया अपनी आपत्ति को दूर करें यदि आपकी आपत्ति को संबोधित किया गया है, या मुझे बताएं कि क्या आपको लगता है कि उत्तर में कुछ गलत है। धन्यवाद।
kjhughes

0

यह मेरे मामले में काम करता है। मुझे आशा है कि आप इसका अर्थ निकाल सकते हैं।

//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.