2010-09-04 15 views
69

निम्न XML पर विचार करें:कैसे XElement या LINQ के साथ XPath उपयोग कैसे करें?

<response> 
    <status_code>200</status_code> 
    <status_txt>OK</status_txt> 
    <data> 
    <url>http://bit.ly/b47LVi</url> 
    <hash>b47LVi</hash> 
    <global_hash>9EJa3m</global_hash> 
    <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url> 
    <new_hash>0</new_hash> 
    </data> 
</response> 

मैं एक बहुत छोटे से रास्ता सिर्फ <hash> तत्व का मान प्राप्त करने के लिए की तलाश में हूँ। मैंने कोशिश की:

var hash = xml.Element("hash").Value; 

लेकिन यह काम नहीं कर रहा है। क्या XElement पर XPath क्वेरी प्रदान करना संभव है? मैं बड़ा System.Xml ढांचे के साथ यह कर सकते हैं, की तरह कुछ कर रही है:

xml.Node("/response/data/hash").Value 

वहाँ एक LINQ नाम स्थान में कुछ इस तरह है?


अद्यतन:

इस के साथ आसपास monkeying कुछ और मैं एक रास्ता मिल गया मैं क्या करने की कोशिश कर रहा हूँ करने के लिए करने के बाद:

var hash = xml.Descendants("hash").FirstOrDefault().Value; 

मैं अभी भी यह देखने के लिए दिलचस्पी होगी किसी के पास बेहतर समाधान है?

+3

FirstOfDefault का प्रयोग न करें() में इस मामले में, क्योंकि अगर "हैश" नहीं मिला है तो आपको NullReferenceException मिलेगा। इसके बजाय पहले() का उपयोग करें, आपको एक और वर्णनात्मक अपवाद मिलेगा। – kaalus

+2

यदि आप "हैश" हमेशा मौजूद होने की अपेक्षा करते हैं तो पहले() का उपयोग करें। अन्यथा, FirstOrDefault() ठीक है जब तक आप वैल्यू प्रॉपर्टी तक पहुंचने से पहले शून्य की जांच करते हैं। –

उत्तर

120

LINQ से XML के साथ XPath का उपयोग करने के लिए System.Xml.XPath के लिए उपयोग घोषणा जोड़ें, यह System.Xml.XPath.Extensions के विस्तार विधियों को दायरे में लाएगा।

अपने उदाहरण में:

var value = (string)xml.XPathEvaluate("/response/data/hash"); 
+1

ठीक है, मूल प्रश्न –

+3

के सबसे नज़दीक लगता है असल में, यह (System ?Xml.XPath' में है (अब?)। –

+0

@DanFriedman यह स्थानांतरित नहीं हुआ है। नोट लिंक क्लास डॉक्स के लिए है, थोड़ा पहले मैं नामस्थान (एक लिंक के बिना) देता हूं। – Richard

13

देखें, जब एक्सएमएल तुम क्यों LINQ का उपयोग वास्तविक वस्तु पाने के लिए न करने के लिए LINQ के साथ काम कर।

वंशज पूरे एक्सएमएल से प्रत्येक तत्व खोजने के लिए और सभी वस्तुओं को नाम निर्दिष्ट से मेल खाता है कि सूचीबद्ध करता है। तो आपके मामले में हैश वह नाम है जो इसे पाता है।

तो, बल्कि

var hash = xml.Descendants("hash").FirstOrDefault().Value; 

कर की तुलना में मैं की तरह अलग टूट जाएगा:

var elements = xml.Descendants("hash"); 
var hash = elements.FirstOrDefault(); 

if(hash != null) 
hash.Value // as hash can be null when default. 

इस तरह आप भी गुण मिल सकता है में, तत्वों आदि

यह आलेख चेक नोड इसके बारे में स्पष्ट विचार प्राप्त करें ताकि इससे मदद मिल सके। http://www.codeproject.com/KB/linq/LINQtoXML.aspx मुझे आशा है कि यह आप में मदद मिलेगी।

+2

@adhishek +1 तत्व को अपने स्वयं के चर से अलग करने के मूल्य को समझाने के लिए +1 ताकि आप अन्य सामान जैसे गुण प्राप्त कर सकें, आदि .. –

+1

XPath का उपयोग करने का एक कारण यह है कि आप उन सभी चीजों को खो देते हैं जो XPath कर सकते हैं और लिंक नहीं कर सकता । दिमाग में आने वाला पहला स्पष्ट एक रन निष्पादित करना है जिसे रनटाइम पर परिभाषित किया गया है (कॉन्फ़िगरेशन या किसी भी चीज़ से पढ़ी गई अभिव्यक्ति कहें)। –

33

दूसरों ने पूरी तरह से उचित रूप से सुझाव दिया है कि आप "मूल" LINQ को एक्सएमएल प्रश्नों का उपयोग करने के लिए कैसे करना चाहते हैं।

हालांकि, विकल्प के बहुत सारे प्रदान करने के हित में, (वे XNode पर सभी विस्तार तरीकों रहे हैं) एक XNode के खिलाफ xPath अभिव्यक्ति का मूल्यांकन करने पर विचार XPathSelectElement, XPathSelectElements और XPathEvaluate। तुम भी CreateNavigator का उपयोग एक XNode के लिए एक XPathNavigator बनाने के लिए कर सकते हैं।

व्यक्तिगत रूप से मैं LINQ से XML API का उपयोग करने का एक बड़ा प्रशंसक हूं, क्योंकि मैं एक बड़ा LINQ प्रशंसक हूं, लेकिन यदि आप XPath के साथ अधिक आरामदायक हैं, तो उपर्युक्त आपकी मदद कर सकता है।

5

आप .Element() विधि श्रृंखला के तत्वों XPath की तरह संरचना के रूप में उपयोग कर सकते हैं।

अपने उदाहरण के लिए:

XElement xml = XElement.Parse(@"...your xml..."); 
XElement hash = xml.Element("data").Element("hash"); 
+0

मुझे लगता है यह सबसे अच्छा जवाब है क्योंकि LINQ से XML क्वेरी (जिसे अनुशंसित नहीं किया गया है) के साथ XPath का उपयोग करने के बजाय LINQ से XML (जिसे अनुशंसित किया जाता है) का उपयोग जारी रखने के दौरान यह काम पूरा हो जाता है। –

+1

XPath का उपयोग करना अधिक संक्षिप्त है, खासकर यदि आप किसी भी भव्य बच्चे या उससे आगे की तलाश में हैं। –

1

मैं xpath पैदा करने के लिए एक LINQesq ढांचे के साथ आने की कोशिश की है। यह आप ग # लैम्ब्डा का उपयोग कर xpath का वर्णन करने देता भाव

var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr"); 

var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text); 

सुनिश्चित नहीं हैं कि अगर यह इस संदर्भ में उपयोगी है, लेकिन आप प्रलेखन यहाँ पा सकते हैं:

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

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