2011-06-10 14 views
13

मैं कुछ वर्ग वस्तुओं में एक XML फ़ाइल deserialize करने के लिए कोशिश कर रहा हूँ: कलाकार, एलबम, और गीतdeserialize XElement

यहाँ मौजूदा सेटअप है:

static void Main(string[] args) 
    { 
     var riseAgainst = DeSerializer(CreateElement()); 
     Console.WriteLine(string.Format("Band: {0}",riseAgainst.Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine(string.Format("Album: {0}",riseAgainst.Album.Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine("Song List:\r"); 
     foreach(var s in riseAgainst.Album.Songs) 
     { 
      Console.WriteLine(string.Format("Song: {0}", s)); 
     } 
     Console.ReadLine(); 
    } 

    static XElement CreateElement() 
    { 
     return new XElement("Artist", 
       new XElement("Name", "Rise Against"), 
       new XElement("Album", 
        new XElement("Name", "Appeal to Reason"), 
        new XElement("Songs", 
         new XElement("Song", "Hero of War"), 
         new XElement("Song", "Savior")) 
         ) 
      ); 
    } 

    static Artist DeSerializer(XElement element) 
    { 
     var serializer = new XmlSerializer(typeof(Artist)); 
     return (Artist)serializer.Deserialize(element.CreateReader()); 
    } 
} 

public class Artist 
{ 
    public string Name { get; set; } 
    public Albums Album { get; set; } 
} 

public class Albums 
{ 
    public string Name { get; set; } 
    public Songs Songs { get; set; } 
} 

public class Songs 
{ 
    public string Song { get; set; } 
} 
समस्या मैं

वर्तमान में यह है कि यदि एक से अधिक कलाकार, एल्बम, और/या गीत हैं तो यह केवल पहले को भरता है। मैं इसे कैसे बना सकता हूं ताकि यह एल्बम, या कलाकार के सभी गीतों के लिए उन्हें भर सके ... आदि। मैंने उन्हें Arrays के रूप में सेट करने की कोशिश की लेकिन यह काम नहीं किया। अग्रिम में धन्यवाद।

+0

हमें 1 कलाकार से _more_ और deserialize कोड के साथ एक सूची दिखाएं। संकेत: क्या आपके पास 'कलाकार' वर्ग भी है? –

उत्तर

17

मैं अपनी कक्षाओं एक छोटा सा तो अब संशोधित कलाकार एक List<Album> है और एल्बम List<Songs>

है मुझे यकीन है कि यह कक्षाएं ठीक से भरता बनाने के लिए उत्पन्न xml एक छोटा सा संशोधन करना पड़ा। यहां कोड

static void Main(string[] args) 
{ 
    var riseAgainst = DeSerializer(CreateElement()); 
     Console.WriteLine(string.Format("Band: {0}",riseAgainst.Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine(string.Format("Album: {0}",riseAgainst.Albums.First().Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine("Song List:\r"); 
     foreach(var s in riseAgainst.Albums.First().Songs) 
     { 
      Console.WriteLine(string.Format("Song: {0}", s.Name)); 
     } 
     Console.ReadLine(); 



    static XElement CreateElement() 
    { 
     return new XElement("Artist", 
       new XElement("Name", "Rise Against"), 
       new XElement("Albums", 
        new XElement("Album", 
         new XElement("Name", "Appeal to Reason"), 
         new XElement("Songs", 
          new XElement("Song", new XElement("Name", "Hero of War")), 
          new XElement("Song", new XElement("Name", "Savior"))) 
         )) 
      ); 
    } 

    static Artist DeSerializer(XElement element) 
    { 
     var serializer = new XmlSerializer(typeof(Artist)); 
     return (Artist)serializer.Deserialize(element.CreateReader()); 
    } 
} 

public class Artist 
{ 
    public string Name { get; set; } 
    public List<Album> Albums { get; set; } 
} 

public class Album 
{ 
    public string Name { get; set; } 
    public List<Song> Songs { get; set; } 
} 

public class Song 
{ 
    public string Name { get; set; } 
} 

आशा है कि मदद करता है। यह उस मामले को कवर नहीं करता है जहां आप एक से अधिक कलाकार चाहते हैं।

+0

वही है जो मुझे चाहिए था। धन्यवाद! मैंने सूची का उपयोग करने के बारे में नहीं सोचा था ... मस्तिष्क फार्ट! : पी फिर से धन्यवाद! – Alex

+0

आपका स्वागत है! – marto