【问题标题】:deserialize xml in complex object反序列化复杂对象中的xml
【发布时间】:2012-03-26 11:00:41
【问题描述】:

我不明白为什么 object 为空:

        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

那我该怎么办?

【问题讨论】:

    标签: c# asp.net-mvc-3 xml-parsing xml-deserialization


    【解决方案1】:

    尝试将您的 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 类完全忽略。

    【讨论】:

      【解决方案2】:

      fm 类的 lfm 属性必须将 track 作为其 XmlElement:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多