.net - How to implement a simple XPath lookup -


हमारे पास बहुत ही सरल कार्यान्वयन के साथ एक XML फ़ाइल है:

  & lt; root xmlns : XLink = "http://www.w3.org/1999/xlink" & gt; & Lt; प्रथम चाल्ड id = "ID1" / & gt; ... & lt; ref xlink: href = "# ID1" / & gt; & Lt; / जड़ & gt;  

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

एक XPath लुकअप में आप & lt ; Ref> नोड जैसे अभिव्यक्ति का प्रयोग करके:

  // * [@ id = 'id1']  

क्या सबसे अच्छा उपयोग कर रहा है? मैंने इन पंक्तियों के साथ कुछ सोचा होगा:

  XDocument doc = XDocument.Load ("file.xml"); Var dest = xDoc.Descendants ()। जहां (ई = & gt; (स्ट्रिंग) ई। विशेषता ("आईडी") == "ID1")। सिंगलऑर डीफॉल्ट ();  

मैंने वास्तव में इसका अभी तक परीक्षण नहीं किया है। लेकिन सामान्य शब्दों में, यदि एक्सएमएल दस्तावेज काफी बड़ा है, तो क्या LINQ का रास्ता अक्षम होना होगा (क्योंकि यह XDocument पर सभी वंशों का गणन का उपयोग कर रहा है)? क्या एक XPathNavigator पर वापस लौटना बेहतर होगा और बस XPath अभिव्यक्ति का उपयोग करें?

यदि इस तरह की चीज LINQ में करना ठीक है, तो मैंने जो लिखा है उससे बेहतर तरीका क्या है? LINQ अभी भी मेरे लिए कुछ ही दिनों पुराना है ... यह बढ़िया है, लेकिन मुझे आश्चर्य है कि इसमें कुछ कार्यों के लिए दक्षता की सीमाएं हैं।

XPathNavigator यहां किसी भी अधिक कुशल नहीं होने जा रहा है, क्योंकि यह अभी भी सभी वंशजों को उनको खोजने के लिए करना होगा - वहां कोई जादू धूल नहीं है। यदि आप चाहते हैं कि इससे अधिक कुशल हो, आपको एक सूचकांक की आवश्यकता होगी, और कोई भी अंतर्निहित XML API उन्हें बॉक्स से बाहर नहीं निकालता है, इसलिए आपको अपना खुद का रोल करना होगा उदाहरण के लिए:

  XDocument doc = ...; Var id2elem = (doc.Descendants में ई से) आईडी id = e.Attribute ("id") जहां id! = Null नया {आईडी = id.Value, Element = e} चुनें) .doc (kv = & gt; kv) आईआईडी, केवी = & gt; केवी। एलेमेंट);  

और तब उस डिक्शनरी का उपयोग जब भी आपको करने की आवश्यकता होती है, आईडी द्वारा नोड्स को देखने के लिए करें। जाहिर है, यह केवल सार्थक है अगर लुकअप अपेक्षाकृत लगातार होते हैं, और यदि आपको इसे एक बार या दो बार करना पड़ता है।


Comments

Popular posts from this blog

c# - ListView onScroll event -

PHP - get image from byte array -

Linux Terminal Problem with Non-Canonical Terminal I/O app -