Tuesday 15 September 2015

Why linq to xml fails to select child nodes without explicit cardinality constraint? -


निम्नलिखित संरचना के साथ एक xml फाइल है

  .... & lt; workDomain & gt ; ... & lt; घटना & gt; कुछ मान & lt; / event & gt; ..... & lt; घटना & gt; & Lt; कोड कोडसंवादक = "सीसीवील 1" कोड = "4567" & gt; ... & lt; कोड & gt; & Lt; / घटना & gt; & Lt; / workDomain & gt;   

मुझे कोड बच्चों के साथ इस घटना में कोई दिलचस्पी है, कोई भी संहिता बच्चों के बिना साधारण घटना नहीं।

हालांकि, अगर मैं निम्नलिखित linq क्वेरी का उपयोग करता हूं: <पूर्व> var res = xDoc.Descendants (nsohr + "workDomain") में नोड से। एकल ()। Descendants (nsohr + "event") जहां नोड। Descendants (nsohr + "code")। एकल ( ) .विशेषता ("कोडसंवाद")। मान। एक्लॉल्स् ("सीसीवील 1") & amp; amp; नोड। डिसेन्डेंट्स (एनएसओआर + "कोड")। एकल ()। विशेषता ("कोड")। मान। एक्लॉल्स् ("4567") चयन नोड;

कुछ नहीं देता मुझे ये मिल रहा है: "अनुक्रम में कोई तत्व नहीं है" अपवाद अगर मैं पूर्वार्द्ध के साथ रास्तों को पुनरावृति करने का प्रयास करता हूं।

अगर मैं घटनाओं के बच्चों के अस्तित्व को एक स्पष्ट बाधा जैसे नीचे के रूप में लागू करता हूं:

  var res = xDoc.Descendants (nsohr + "workDomain") में नोड से। एकल ()। Descendants (nsohr + "event") जहां नोड। डिसेन्डेंट्स (एनएसओआर + "कोड")। () & Gt; 0 और amp; amp; नोड। डिसेन्डेंट्स (एनएसओआर + "कोड")। एकल ()। विशेषता ("कोडकंटेनर")। मान। एक्लॉल्स् ("सीसीवील 1") और amp; नोड। डिसेन्डेंट्स (एनएसओआर + "कोड")। एकल ()। विशेषता ("कोड")। मान। एक्लॉल्स् ("4567") चयन नोड;   

तब सब कुछ अपेक्षित रूप से काम करता है पृथ्वी पर मुझे क्यों जोड़ना पड़ता है

नोड। डिसेन्डेंट्स (एनएसओआर + "कोड")। गणना () & gt; 0 ? वंश पर बाधाओं को उनके अस्तित्व का मतलब होना चाहिए, या इसलिए मुझे लगता है यह मेरे लिए बहुत अप्राकृतिक लगता है मैं यहाँ क्या लापता हूं?

अपडेट: जॉन के उदाहरण से मुझे मेरी गलतफहमी देखने में मदद मिली जिस तरह से linq को xml काम करता है मैं किसी भी तरह इस धारणा के तहत था कि नोड्स पर दिए गए मापदंड नोड्स का निर्धारण करेगा जो कि गलत तरीके से चुने जाते हैं (डीबी क्वेरी) जैसे काम करते हैं: डीबी पार्सिंग एसक्यूएल और डाटा आदि का चयन ... मैं बस कॉलिंग उन तरीकों को कॉल करने के लिए गलत ऑब्जेक्ट्स के तरीके जॉन की स्निपेट एक छोटी सी फिक्स के साथ (यह मानते हुए कि मैं कुछ नहीं भूले हूं), उम्मीद के अनुसार काम करता है:

  var res = xDoc.Descendants (nsohr + "workDomain") .उपचारकर्ता (nsohr + इवेंट ")। जहां (एक्स = & gt; x.Elements (" code ")। कोई भी (y = & gt; (स्ट्रिंग) y.Attribute (" codeContainer ") ==" CCVal1 "& amp; amp; और (स्ट्रिंग) y विशेषता ("कोड") == "4567"));    

"कुछ नहीं लौटाता है" और "मुझे कोई अपवाद मिलता है" बहुत < / Em> अलग है।

समस्या यहां है:

  जहां नोड। डिसेन्डेंट्स (एनएसओआर + "कोड")। सिंगल ()। विशेषता ("कोडकंटेनर")। मान। एक्लॉल्स् ("सीसीवील 1")   

आप सिंगल () उपयोग कर रहे हैं, जो एक अपवाद फेंकना है, यदि कोई एक तत्व बिल्कुल नहीं है और यकीन है कि पर्याप्त है, आपको यह अपवाद मिलता है।

आपकी क्वेरी बहुत सरल हो सकती है:

  var res = xDoc.Descendants (nsohr + "workDomain") (एक्सचेंज + "इवेंट" ; (स्ट्रिंग) x। विशेषता ("कोड") == "4567"));   

(यह मानते हुए कि कोड हमेशा event का एक प्रत्यक्ष बच्चा है, यदि ऐसा नहीं है, तो आप descendants < / Code> के बजाय तत्वों ।)

दूसरे शब्दों में, घटना वांछित workDomain तत्वों, जहां कम से कम एक बच्चे कोड बच्चे तत्व में प्रासंगिक विशेषताएं हैं।

No comments:

Post a Comment