2010-08-09 21 views
5

मैं एक एक्सएमएल फ़ाइल में सभी नोड्स को एक सूची में जोड़ने की कोशिश कर रहा हूं, और मैं कुछ गलत कर रहा हूं लेकिन मैं अपने जीवन के लिए भार को देखने के बाद भी इसे समझ नहीं सकता उदाहरणों के। यहाँसी # Foreach एक्सएमएल नोड

<queue> 
<slots> 
<slot> 
<status>Downloading</status> 
<filename>file1</filename> 
<size>1 GB</size> 
</slot> 
<slot> 
<status>Downloading</status> 
<filename>file2</filename> 
<size>2 GB</size> 
</slot> 
</slots> 
</queue> 

और कोड है:: इस एक्सएमएल टुकड़ा है

 XDocument xDoc = XDocument.Load(xmlFilePath); 

     List<Download> list = new List<Download>(); 

     foreach (var download in xDoc.Descendants("slots")) 
     { 
      string filename = download.Element("filename").Value; 
      string size = download.Element("size").Value; 
      string status = download.Element("status").Value; 
      list.Add(new Download { Filename = filename, Size = size, Status = status });    
     } 

किसी भी मदद की बहुत हमेशा की तरह की सराहना की।

संपादित करें: स्पष्ट करने के लिए, मैं

string filename = download.Element("filename").Value; 

पर एक NullReferenceException हो रही है और मुझे पता है सूचीदृश्य याद आ रही है, मैं अभी तक कि बिट नहीं किया है :)

+1

क्या आप WPF या Winforms का उपयोग कर रहे हैं? मैं आपको एक सूची बना रहा हूँ। सूची सूची में कैसे बाध्य है? और क्या काम नहीं कर रहा है? क्या आपको अपवाद मिल रहा है? क्या सूची सिर्फ भर नहीं रही है? क्या सूचीदृश्य में कुछ भी नहीं है? क्या उम्मीदवारों में कुछ भी नहीं है? – JMarsch

+0

क्षमा करें मैंने इसे थोड़ा और स्पष्ट कर दिया है! – JoeBeez

+1

बदले में xDoc.Descandants ("स्लॉट्स") का प्रयास करें –

उत्तर

3
var list = (from download in xDoc.Descendats("slot") 
      select new Download 
        { 
         Filename = (string) download.Element("filename"), 
         Size = (string) download.Element("size"), 
         Status = (string) download.Element("status") 
        }).ToList(); 

यह दिखता है nicer, और चूंकि आपने यह नहीं कहा कि आपके कोड में वास्तव में क्या गलत है, यह सब कुछ मैं कर सकता हूं।

अद्यतन: बस इसका परीक्षण किया गया, और यह आपके अपवाद को हल करता है।

+0

पर स्पॉट, और यह भी अच्छी तरह से दिखता है! – JoeBeez

+0

यह संभावित रूप से विकृत XML को अनदेखा करके और फ़ाइल नाम के लिए एक शून्य डालने से NullReferenceException को हल करता है। –

+0

@Yuriy 'nullReferenceException'' slot' नोड के तत्व के बजाय 'स्लॉट्स नोड' के तत्व के रूप में 'फ़ाइल नाम' नोड तक पहुंचने का प्रयास करके किया गया था। आप बाद में लापता मूल्यों का ख्याल रख सकते हैं (उदा। '। जहां (डी =>! स्ट्रिंग। आईएस नूलऑरफेक्टी (डी। फिलेनाम)) ')। – Necros

2

आपके उदाहरण में एक्सएमएल ठीक काम करता है। NullReferenceException हो रहा है क्योंकि आपके द्वारा उपयोग किए जा रहे वास्तविक XML में स्लॉट में से एक में फ़ाइल नाम तत्व नहीं है। आप

string filename = download.Element("filename") == null ? 
    String.Empty : download.Element("filename").Value; 

उपयोग कर सकते हैं बजाय अगर वहाँ filename के लिए एक संभावित डिफ़ॉल्ट है। लेकिन इस अपवाद को सही ढंग से संभालने की अधिक संभावना बेहतर है।

+0

+1 उसकी बग खोजने के लिए! – JohnB

1
void LoadSlots() 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(Environment.CurrentDirectory + "\\queue.xml"); 

    XmlNodeList nodes = doc.SelectNodes("//queue/slots/slot"); 

    foreach (XmlNode node in nodes) 
    { 
    string filename = node.Attributes["filename"].InnerText; 
    string size = node.Attributes["size"].InnerText; 
    string status = node.Attributes["status"].InnerText; 
    _slots.Add(filename, size, status); 
    } 
} 
+0

आपने XDocument के बजाय XmlDocument का उपयोग करने के लिए इसे क्यों बदल दिया? फिर आपके पास मूल रूप से पोस्ट किए गए तत्वों के बजाय गुणों के रूप में फ़ाइल नाम, आकार और स्थिति है। और फिर एक गूढ़ _slots है, यह क्या है? –

+0

क्षमा करें, मैंने इसे चलाया और यह हालांकि काम करता है। 'सूची' के साथ '_slots' को बदलें। मैंने अभी इसे एक विशिष्ट नाम दिया है, यानी 'निजी सूची _slots = नई सूची (); ' – JohnB

+0

हालांकि, एक और टाइपो होना चाहिए,' _slots.Add (नया QueueSlot (फ़ाइल नाम, आकार, स्थिति);' – JohnB

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