2012-12-13 13 views
5

सूची में ऑब्जेक्ट लिखना मेरे पास एक तरीका है जो form_load ईवेंट पर निष्पादित करता है जो ठीक से एक पंक्ति को छोड़कर काम करता है।नेस्टेड फोरैच लूप पढ़ने .xml और

private int ReadInPeople() 
{ 
    XmlNodeList nodeList = m_xmlDoc.DocumentElement.ChildNodes; 
    foreach (XmlNode PersonNode in nodeList) 
    { 
     Employee ccontact = new Employee(); 
     foreach (XmlNode PersonTag in PersonNode.ChildNodes) 
     { 
      switch (PersonTag.Name) 
      { 
       case "Employee": 
        ccontact.EmployeeNumber = PersonTag.FirstChild.Value; 
        break; 
       case "FirstName": 
        ccontact.FirstName = PersonTag.FirstChild.Value; 
        break; 
       case "LastName": 
        ccontact.LastName = PersonTag.FirstChild.Value; 
        break; 
       default: 
        break; 
      } 
     } 
     this.AddContact(ccontact); 
    } 
    return nodeList.Count; 
} 

AddContact विधि कर्मचारी ऑब्जेक्ट को स्थिर सूची में जोड़ती है; हालांकि, रेखा:

this.AddContact(ccontact); 

निष्पादित नहीं किया जा रहा था।

एक्सएमएल फ़ाइल का एक नमूना:

<?xml version="1.0" encoding="utf-8"?> 
<people> 
    <person> 
    <Employee>123456789</Employee> 
    <FirstName>John</FirstName> 
    <LastName>Smith</LastName> 
    </person> 
    <person> 
    <Employee>987654321</Employee> 
    <FirstName>Ellen</FirstName> 
    <LastName>Wayne</LastName> 
    </person> 
</people> 

मैं एक ब्रेकपाइंट और डीबगिंग, और यकीन है कि पर्याप्त स्थापित करने की कोशिश की थी, लाइन पूरी तरह से खत्म हो गया छोड़ दिया गया जैसे कि वह वहाँ भी नहीं थे।

एलन की सलाह के अनुसार, मैंने PersonTag.FirstChild.Value को बदल दिया क्योंकि यह एक चाइल्ड नोड का संदर्भ देने का प्रयास कर रहा था जो अस्तित्व में नहीं था।

अद्यतन, काम कर रहे विधि:

private int ReadInPeople() 
{ 
    XmlNodeList nodeList = m_xmlDoc.DocumentElement.ChildNodes; 
    foreach (XmlNode PersonNode in nodeList) 
    { 
     Employee ccontact = new Employee(); 
     foreach (XmlNode PersonTag in PersonNode.ChildNodes) 
     { 
      switch (PersonTag.Name) 
      { 
       case "Employee": 
        ccontact.EmployeeNumber = PersonTag.InnerText; 
        break; 
       case "FirstName": 
        ccontact.FirstName = PersonTag.InnerText; 
        break; 
       case "LastName": 
        ccontact.LastName = PersonTag.InnerText; 
        break; 
       default: 
        break; 
      } 
     } 
     this.AddContact(ccontact); 
    } 
    return nodeList.Count; 
} 
+1

'AddContact' एक' System.Diagnostics.ConditionalAttribute' के साथ चिह्नित विधि है? – eulerfx

+0

@eulerfx - ऐसा नहीं है कि मुझे पता है - क्या सत्यापित करने का कोई तरीका है? – tloveless

+0

उस विधि की परिभाषा पर जाएं और देखें कि यह उस विशेषता के साथ चिह्नित है या नहीं। – eulerfx

उत्तर

2

आप आसानी से अपने एक्सएमएल LINQ साथ एक्सएमएल को पार्स कर सकते हैं

XmlNodeList nodeList = m_xmlDoc.DocumentElement.SelectNodes("person"); 
foreach (XmlNode PersonNode in nodeList) 
{ 
    Employee ccontact = new Employee(); 
    ccontact.LastName = PersonNode["LastName"].InnerText; 
    ccontact.FirstName = PersonNode["FirstName"].InnerText; 
    ccontact.EmployeeNumber = PersonNode["Employee"].InnerText; 
    this.AddContact(ccontact); 
} 
+0

+1। यह एक बहुत अच्छा समाधान है। यदि आप पहली बार क्वेरी बनाने के बजाय सीधे वंशजों पर लूप करेंगे तो यह थोड़ा आसान होगा .. –

+0

@ ओलिवियर जैकोट-डेस्कोम्ब्स धन्यवाद! मैंने कई साल पहले एक्सएमएल डॉक्यूमेंट के माध्यम से एक्सएमएल पार्सिंग के साथ काम किया था, लेकिन अब मुझे लिंक का एक्सएमएल मिलने के बाद इसका उपयोग करने का कोई कारण नहीं दिख रहा है :) कारण मैंने पहली बार क्वेरी की है, मैंने पार्सिंग को अलग करने और व्यवसाय तर्क लागू करने का कारण बताया है संपर्कों के लिए) .. लेकिन हाँ कोड और भी कॉम्पैक्ट हो सकता है :) –

+0

हाँ, 'System.Xml.Linq' के साथ काम करने के लिए एक बहुत ही सरल और तेज आगे ऑब्जेक्ट मॉडल है। –

2

क्या आप वाकई सिर्फ एक अपवाद का पूरा उपयोग नहीं कर रहे हैं कर रहे हैं? अपने तर्क को एक कोशिश/पकड़ में लपेटें और देखें कि यह हिट करता है या नहीं।

लाइन्स इस तरह अशक्त संदर्भ अपवाद पैदा कर सकता है और कारण आप कोड की है कि लाइन का पूरा उपयोग नहीं कर रहे हैं हो सकता है:

PersonTag.FirstChild.Value 

मैं FirstChild कर्मचारी, प्रथम नाम पर पर बुला कल्पना कर सकते हैं, या अंतिम नाम वापसी होगी शून्य, क्योंकि उनमें कोई बच्चा नोड नहीं है।

शायद कोशिश:

XDocument xdoc = XDocument.Load(path_to_xml); 
var employees = xdoc.Descendants("person") 
        .Select(p => new Employee() 
        { 
         FirstName = (string)p.Element("FirstName"), 
         LastName = (string)p.Element("LastName"), 
         EmployeeNumber = (long)p.Element("Employee") 
        }); 

foreach (var ccontact in employees) 
    this.AddContact(ccontact); 

XmlDocument समाधान:

PersonTag.InnerText 
+0

मैंने प्रत्येक व्यक्ति को स्विच किया। फर्स्ट चाइल्ड। पर्सोन्टाग के लिए वैल्यू। वैल्यू और अब डीबगर समस्या रेखा को हिट करता है - लेकिन पार्स किए जाने वाले मान अब शून्य हैं। – tloveless

+1

हालांकि, आपने मुझे सही रास्ते पर धक्का दिया! मैंने उन्हें एक बच्चे के बजाय पाठ की खोज करने के लिए PersonTag.InnerText में अपडेट किया और सब ठीक है। धन्यवाद! – tloveless

0

Build -> Rebuild Solution?

इसे कभी-कभी मदद करने के लिए जाना जाता है।

या शायद: Debug -> Exceptions... -> Thrown

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