2009-05-19 11 views
13

मेरे एक्सएमएल लगता है:SelectSingleNode में XPath का उपयोग करना: एक्सएमएल से अलग-अलग तत्व प्राप्त कर रहा है, अगर यह मौजूद है

<?xml version=\"1.0\"?> 
<itemSet> 
     <Item>one</Item> 
     <Item>two</Item> 
     <Item>three</Item> 
     .....maybe more Items here. 
</itemSet> 

व्यक्ति आइटम में से कुछ या मौजूद नहीं हो सकता है। मान लें कि मैं तत्व <Item>दो</Item> यदि यह मौजूद है, तो पुनर्प्राप्त करना चाहता हूं। मैंने निम्नलिखित XPaths (सी # में) की कोशिश की है।

  • XMLNode node = myXMLdoc.SelectSingleNode("/itemSet[Item='two']") --- तो आइटम दो मौजूद है, तो यह मुझे केवल पहला तत्व एक देता है। हो सकता है कि यह क्वेरी केवल आइटमसेट में पहले तत्व को इंगित करे, अगर उसके पास बच्चे के रूप में कहीं दो मूल्य का आइटम है। क्या यह व्याख्या सही है?

तो मैं करने की कोशिश की:

  • XMLNode node = myXMLdoc.SelectSingleNode("/itemSet[Item='two']/Item[1]") --- मैं के रूप में इस क्वेरी पढ़ा है, मुझे वापसी itemSet के भीतर पहली <Item> तत्व मूल्य होता है = 'दो'। क्या मैं सही हूँ?

यह अभी भी केवल पहले तत्व एक देता है। मैं क्या गलत कर रहा हूं? दोनों मामलों में, भाई बहनों का उपयोग करके मैं बच्चे नोड्स को पार कर सकता हूं और दो पर जा सकता हूं, लेकिन यह वह नहीं है जिसे मैं देख रहा हूं। इसके अलावा यदि दो अनुपस्थित हैं तो SelectSingleNode शून्य लौटाता है। इस प्रकार तथ्य यह है कि मुझे एक सफल रिटर्न नोड मिल रहा है, यह तत्व दो की मौजूदगी का संकेत देता है, इसलिए क्या मैं दो की चॉक उपस्थिति के लिए बूलियन परीक्षण चाहता था, उपर्युक्त XPaths में से कोई भी पर्याप्त होगा, लेकिन मुझे वास्तव में पूर्ण आवश्यकता है तत्व <Item>two</Item> मेरे रिटर्न नोड के रूप में।

[मेरा पहला प्रश्न, और मेरा पहला समय वेब प्रोग्रामिंग के साथ काम कर रहा है, इसलिए मैंने अभी उपरोक्त XPaths और संबंधित xml सामान को फ्लाई पर अभी सीओ में पिछले प्रश्नों से सीखा है। तो नम्र रहो, और मुझे बताएं कि क्या मैं कोई समुदाय हूं या किसी भी समुदाय के नियमों को झुका रहा हूं। । धन्यवाद]

उत्तर

23

मुझे लगता है कि आप चाहते हैं:

myXMLdoc.SelectSingleNode("/itemSet/Item[text()='two']") 

दूसरे शब्दों में, आप आइटम जो दो, itemSet नहीं यह युक्त पाठ है चाहता हूँ।

तुम भी संदर्भ नोड इंगित करने के लिए, अपने मामले में एक भी डॉट उपयोग कर सकते हैं:

myXMLdoc.SelectSingleNode("/itemSet/Item[.='two']") 

संपादित करें: . और text() के बीच अंतर यह है कि . का अर्थ है "इस नोड" प्रभावी ढंग से, और text() माध्यम "है, इस नोड के सभी पाठ नोड बच्चे "। दोनों मामलों में तुलना एलएचएस के "स्ट्रिंग-वैल्यू" के खिलाफ होगी। एक तत्व नोड के लिए, स्ट्रिंग-वैल्यू "दस्तावेज़ ऑर्डर में तत्व नोड के सभी पाठ नोड वंशजों के स्ट्रिंग-मानों का समापन" है और टेक्स्ट नोड्स के संग्रह के लिए, तुलना जांच करेगी कि कोई भी टेक्स्ट नोड बराबर है या नहीं जिसकी आप जांच कर रहे हैं।

तो यह कोई फर्क नहीं पड़ता जब तत्व सामग्री केवल एक ही पाठ नोड है, लेकिन लगता है कि हम था:

<root> 
    <item name="first">x<foo/>y</item> 
    <item name="second">xy<foo/>ab</item> 
</root> 

फिर "root/item[.='xy']" का एक XPath अभिव्यक्ति पहले आइटम से मेल खाएगा, लेकिन "root/item[text()='xy'] "दूसरे मैच होगा।

+0

धन्यवाद जॉन एक टन। आपके दोनों समाधान एक आकर्षण की तरह काम करते थे। विषय पर रहते हुए, क्या मैं पूछ सकता हूं, टेक्स्ट() और। का उपयोग करने में क्या अंतर है? मेरे नमूना एक्सएमएल में यह केवल एक पाठ मान के साथ एक साधारण तत्व है, इसलिए दोनों समाधान एक ही चीज़ लौटते हैं। क्या कोई जटिल XML स्थिति है जहां किसी को दूसरे पर प्राथमिकता दी जाती है या परिणाम अलग होते हैं? (yr ans सही और मतदान करने के अलावा, क्या कुछ भी समुदाय है, मैं आपको धन्यवाद देने के लिए कर सकता हूं?) –

+0

@areaMan: ईमानदार होने के लिए, मुझे "टेक्स्ट()" और " । "। मेरा XPath-fu काफी कम है :) आप अधिक जानने के लिए XPath चश्मा देखना चाहते हैं: http://www.w3.org/TR/xpath आप मुझे धन्यवाद देने के लिए क्या कर सकते हैं ... एक प्रश्न ढूंढें जिसका आप जवाब दे सकते हैं, और इसके साथ-साथ आप इसका जवाब भी दे सकते हैं। ओह, और अच्छे प्रश्न पूछते रहें :) –

+0

कहा कि अंतर जानने के बारे में, मुझे * कुछ * अंतर के बारे में पता है। और पाठ() - संपादित करेंगे। –

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