2012-03-26 3 views
2

я не могу понять, почему объект является пустым:Deserialize XML в сложном объекте

 WebClient browse = new WebClient(); 
     StreamReader res = new StreamReader(browse.OpenRead("http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=b25b959554ed76058ac220b7b2e0a026&artist=cher&track=believe")); 
     string result = res.ReadToEnd(); 

     XmlDocument xmltrackinfo = new XmlDocument(); 
     xmltrackinfo.InnerXml = result; 



     XmlRootAttribute xRoot = new XmlRootAttribute(); 
     xRoot.ElementName = "lfm"; 
     xRoot.IsNullable = true; 

     XmlSerializer xs = new XmlSerializer(typeof(fm), xRoot); 

     fm rez = (fm) xs.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(result))); 

Модель объекта:

[Serializable()] 
[XmlRoot(ElementName = "lfm", IsNullable = true)] 
public class fm 
{ 
    [XmlElement("lfm")] 
    public Track lfm { get; set; } 
} 

[Serializable()] 
[XmlRoot(ElementName = "artist", IsNullable = true)] 
public class artist 
{ 
    public string name { get; set; } 
    public string mbid { get; set; } 
    public string url { get; set; } 
} 

[Serializable()] 
[XmlRoot(ElementName = "album", IsNullable = true)] 
public class album 
{ 
    public string artist { get; set; } 
    public string title { get; set; } 
    public string mbid { get; set; } 
    public string url { get; set; } 
    public List<string> image { get; set; } 
} 

[Serializable()] 
[XmlRoot(ElementName = "tag", IsNullable = true)] 
public class tag 
{ 
    public string name { get; set; } 
    public string url { get; set; } 

} 

[Serializable()] 
[XmlRoot(ElementName = "wiki", IsNullable = true)] 
public class wiki 
{ 
    public string summary { get; set; } 
    public string content { get; set; } 
} 

[Serializable()] 
[XmlRoot(ElementName = "track", IsNullable = true)] 
public class Track 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    public string mbid { get; set; } 
    public string url { get; set; } 
    public string duration { get; set; } 
    public string streamable { get; set; } 
    public string listeners { get; set; } 
    public string playcount { get; set; } 
    public artist artist { get; set; } 
    public album album { get; set; } 
    public List<tag> toptags { get; set; } 
    public wiki wiki { get; set; } 

} 

и XML:

http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=b25b959554ed76058ac220b7b2e0a026&artist=cher&track=believe

так, что должно Я делаю?

ответ

2

Попробуйте переименовать класс fm в lfm.

public class lfm 
{ 
    public Track track { get; set; } 
} 

, а затем вы можете также избавиться от переменной xRoot:

XmlSerializer xs = new XmlSerializer(typeof(lfm)); 
lfm rez = (lfm) xs.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(result))); 

Также вам не нужно атрибут [Serializable]. Это используется для двоичной сериализации и полностью игнорируется классом XmlSerializer.

+0

да, это работает! Также я удалил все атрибуты – Evgeniy

1

lfm свойство fm класса должен иметь трек как его XmlElement:

[Serializable()] 
[XmlRoot(ElementName = "lfm", IsNullable = true)] 
public class fm 
{ 
    [XmlElement("track")] 
    public Track lfm { get; set; } 
} 
+0

да, это точка – Evgeniy