2011-02-10 11 views
6

नामस्थान अज्ञेय वाक्यविन्यास मैंने चारों ओर देखा है मुझे भ्रमित कर रहा है।तत्व सामग्री के साथ नेमस्पेस अज्ञेयवादी XPath क्वेरी

मेरे पास है कहते हैं:

<root> 
    <parent attribute="A">A<child>A</child></parent> 
    <parent attribute="B">B<child>B</child></parent> 
</root> 

अब तक मैं देख रहा हूँ कि कैसे:

/root/parent/child/text() 

करने के लिए अनुवाद:

/*[local-name()='root']/*[local-name()='parent']/*[local-name()='child']/text() 

लेकिन मैं इस तरह चीजों के साथ संघर्ष कर रहा हूँ:

/root/parent[@attribute="A"]/child/text() 

या:

/root/parent[text()="B"]/child/text() 

या:

/root/parent[1]/child/text() 

इन अनुवाद कैसे करूं?

धन्यवाद,

संपादित करें: एक और :-)

<root> 
     <parent> 
      <childName>serverName</childName> 
      <childValue>MyServer</childValue> 
     </parent> 
     <parent> 
      <childName>ServerLocation</childName> 
      <childValue>Somewhere</childValue> 
     </parent> 
</root> 

इस का अनुवाद कैसे करता है?

/root/parent[childName="serverName"]/childValue/text() 
+0

अच्छा सवाल है, +1 बन जाएगा। सभी प्रदान किए गए XPath अभिव्यक्तियों की अनुशंसा, चेतावनी और पूर्ण अनुवाद के लिए मेरा उत्तर देखें। –

उत्तर

10

नाम स्थान नास्तिक वाक्य रचना मैं गया है चारों ओर देखा मुझे भ्रमित कर रहा है।

पहले, मैं आप इस सिंटैक्स का उपयोग करने नहीं सलाह देंगे, खासकर अगर यह भ्रामक है। इसके परिणामस्वरूप त्रुटियां भी हो सकती हैं - विवरण के लिए मेरे उत्तर का अंत देखें।

किसी नामस्थान में मौजूद XPath अभिव्यक्ति नामों में निर्दिष्ट करने का मानक तरीका अपने XPath इंजन (संबंधित, विक्रेता-विशिष्ट दस्तावेज़ देखें) के साथ नामस्थान पंजीकृत करना है और फिर पंजीकृत नामस्थान से जुड़े उपसर्ग का उपयोग करना है ("x" कहें) x:someName

नामों के साथ इस विषय पर बहुत अच्छे उत्तर हैं - jus t उनमें से एक का उपयोग करें।

अब, अगर किसी कारण की वजह से आप अभी भी भ्रामक वाक्य रचना है, तो उपयोग करने का निर्णय:

लेकिन मैं इस तरह चीजों के साथ संघर्ष कर रहा हूँ:

/root/parent[@attribute="A"]/child/text()

का उपयोग करें:

/*[local-name()='root']/*[local-name()='parent' and @attribute='A'] 

तो:

या:

/root/parent[text()="B"]/child/text()

उपयोग:

/*[local-name()='root']/*[local-name()='parent' and text()='B'] 
            /*[local-name()='child']/text() 

तो:

या:

/root/parent[1]/child/text() 

उपयोग:

/*[local-name()='root']/*[local-name()='parent'][1] 
           /*[local-name()='child']/text() 

तो:

वन मोर :-)

<root> 
    <parent> 
     <childName>serverName</childName> 
     <childValue>MyServer</childValue> 
    </parent> 
    <parent> 
     <childName>ServerLocation</childName> 
     <childValue>Somewhere</childValue> 
    </parent> 
</root> 

इसका अनुवाद कैसे करता है?

/root/parent[childName="serverName"]/childValue/text() 

उपयोग:

इस तरह के भाव वांछित नोड्स का चयन नहीं कर सकते यदि XML दस्तावेज़ों में वहाँ एक ही स्थानीय के साथ तत्व हैं:

/*[local-name()='root'] 
     /*[local-name()='parent'][*[local-name()='childName"]='serverName'] 
              /*[local-name()='childValue']/text() 

ध्यान दें करें -नाम जो दो अलग-अलग नामस्थानों से संबंधित है।

+0

+1 ने मुझे 53 सेकंड तक हराया। :-) – LarsH

+0

आप दोनों के लिए +1। – Flack

+0

धन्यवाद दिमित्री, ध्यान दें कि आपकी चेतावनी पर ध्यान दिया गया है :-) दुर्भाग्यवश मुझे इस प्रकार के xpath का उपयोग करने के लिए मजबूर किया गया है क्योंकि मुझे इसे सिस्टम सर्च फीचर में इंस्टॉलशेल्ड में उपयोग करने की आवश्यकता है। दुर्भाग्य से यह सुविधा नामस्थान को परिभाषित करने का कोई तरीका नहीं प्रदान करती है। एक्सएमएल फाइल जो मैं खोज रहा हूं केवल 1 नामस्थान है इसलिए मैं सुरक्षित हूं। बीटीडब्ल्यू वे टोमकैट web.xml विन्यास फाइल हैं। धन्यवाद! –

4

मैं आपके प्रश्न को समझने के लिए समझता हूं, मैं इन XPath अभिव्यक्ति नेमस्पेस-अज्ञेयवादी कैसे बना सकता हूं? (यह एक विशेष वाक्य रचना, बस स्थानीय नाम() फ़ंक्शन का एक विशिष्ट उपयोग नहीं है।)

/root/parent[@attribute="A"]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][@attribute='A']/*[local-name()='child']/text() 

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

/root/parent[text()="B"]/child/text() 

बन

/*[local-name()='root']/*[local-name()='parent'][text() = 'B']/*[local-name()='child']/text() 

और

/root/parent[1]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][1]/*[local-name()='child']/text() 
+0

+1 जितना तेज़ होने के लिए :) :) –

+0

लंबे समय तक नहीं देखे :) आप कहाँ गए हैं? मुझे लगता है कि यह आपके लिए दिलचस्प हो सकता है: http://dnovatchev.wordpress.com/2011/02/08/the-binary-search-tree-data-structurehaving-fun-with-xpath-3-0/ –

+0

+1 तुम दोनों के लिए। – Flack

संबंधित मुद्दे