2012-03-26 10 views
2

Ich kann nicht verstehen, warum Objekt null ist:deserialize xml in komplexen Objekt

 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))); 

Object Model:

[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; } 

} 

und XML:

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

so was sollte Ich mache?

Antwort

2

Versuchen Sie, Ihre fm-Klasse in lfm umzubenennen.

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

und dann könnte man auch der xRoot Variable loszuwerden:

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

Auch brauchen Sie nicht das [Serializable] Attribut. Dies wird für die binäre Serialisierung verwendet und von der Klasse XmlSerializer vollständig ignoriert.

+0

ja, es funktioniert! Auch ich habe alle Attribute gelöscht – Evgeniy

1

Die lfm Eigenschaft der fm Klasse Spur als XmlElement haben muss:

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

ja, das ist der Punkt – Evgeniy