2012-04-10 18 views
6

मेरी Xml फ़ाइल LINQ का उपयोग:xml नोड का चयन करें एक्सएमएल के लिए

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfCustomer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Customer> 
     <CustomerId>1f323c97-2015-4a3d-9956-a93115c272ea</CustomerId> 
     <FirstName>Aria</FirstName> 
     <LastName>Stark</LastName> 
     <DOB>1999-01-01T00:00:00</DOB> 
    </Customer> 
    <Customer> 
     <CustomerId>c9c326c2-1e27-440b-9b25-c79b1d9c80ed</CustomerId> 
     <FirstName>John</FirstName> 
     <LastName>Snow</LastName> 
     <DOB>1983-01-01T00:00:00</DOB> 
    </Customer> 
</ArrayOfCustomer> 

मेरी प्रयास:

Object reference not set to an instance of an object. 

1) x नहीं है:

XElement toEdit = 
    (XElement)doc.Descendants("ArrayOfCustomer") 
       .Descendants("Customer") 
       .Where(x => Guid.Parse((x.Descendants("CustomerId") as XElement).Value) == customer.CustomerId) 
       .First<XElement>(); 

इस निम्न अपवाद फेंकता एक XElement?

2) क्या यह एक उचित है जहां एक एक्सएमएल नोड का चयन करने के लिए लैम्ब्डा है?

3) और निश्चित रूप से CustomerId के अनुसार आपको यह नोड कैसे मिलेगा?

+0

मैं पहले अपवाद है: प्रकार 'WhereEnumerableIterator'1 की वस्तु कास्ट करने में असमर्थ [सिस्टम .Xml.Linq.XElement] 'टाइप करने के लिए' System.Xml.Linq.XElement '। ऐसा इसलिए था क्योंकि मैंने आईनुमरेबल से एक एकल XElement में डालने की कोशिश की, मैंने इसे पहले () एक्सटेंशन जोड़ा। अब यह x को XElement के रूप में नहीं बना सकता है। –

उत्तर

4

आपका समस्या यह है कि Descendents है और Where नहीं एक IEnumerable<XElement> एक भी XElement वापसी है जो आप के बाद कर रहे हैं। आप इस तरह इसे ठीक कर सकते हैं:

XElement toEdit = doc.Descendants("ArrayOfCustomer") 
        .Descendants("Customer") 
        .Where(x => Guid.Parse(x.Descendants("CustomerId").Single().Value) == customer.CustomerId) 
        .FirstOrDefault(); 
+0

बस जागरूक रहें कि इसके लिए ग्राहक के नीचे केवल एक ग्राहक आईडी तत्व होना आवश्यक है। यदि 0 या> 1 है तो यह अपवाद फेंक देगा। और उसके एक्सएमएल को देखने के बाद यह शायद उचित है। लेकिन बस कुछ इंगित करने के लिए। –

+0

@AndrewFinnell विषय पर थे, आप उस नोड को संपादित करने के बारे में कैसे जाएंगे, अब मैं ग्राहक के सभी (XElement) decedents अपडेट कर सकता हूं लेकिन फ़ाइल में नोड को कैसे अपडेट किया जाएगा? –

2

आप x कास्टिंग नहीं कर रहे हैं आप x.Descendants() कास्टिंग कर रहे हैं। x.Descendants() एक संग्रह देता है, इसलिए बहुवचन विधि अर्थपूर्ण। मेरे सिर के ऊपर से तुम क्या करने में सक्षम होना चाहिए x.Descendants("CustomerId").FirstOrDefault() as XElement

1
XElement toEdit = (from c in doc.Descendants("Customer") 
    where Guid.Parse(c.Value) == customer.CustomerId 
    select c).SingleOrDefault(); 
1

मैं इस तरह आपकी क्वेरी पुनर्गठन होगा:

XElement toEdit = doc.Descendants("Customer") 
         .Where(x => (Guid)x.Element("CustomerId") == customer.CustomerId) 
         .FirstOrDefault(); 
संबंधित मुद्दे