XML反序列化为不同的类名

时间:2011-12-21 13:53:40

标签: c# xml serialization

假设我有这个想象中的xml:

<Schedule>
   <Month name="March">
     <Day name="Monday" />
   </Month>
   <Month name="April">
     <Day name="Tuesday" />
     <Day name="Monday" />
   </Month>
</Schedule>

我想反序列化上面的内容。但是,我想使用不同的类层次结构反序列化此xml,因为类Schedule,Month和Day在其他地方使用。

所以例如我想要这些类:

[XmlRoot( "Schedule" )
public class ParserSchedule
{
   [XmlElement("Month")]
   public List<ParserMonth> Month{ get; set; } 
}

public class ParserMonth
{
    [XmlAttribute( "name" )]
    public string Name{ get; set; }

    [XmlElement("Day")]
    public List<ParserDay> Day{ get; set; } 
}

public class ParserDay
{
    [XmlAttribute( "name" )]
    public string Name{ get; set; }        
}

然而,这不起作用。我得到例外,说Day不能序列化,因为它没有默认的公共构造函数。我想这是因为它试图创建Day类的实例而不是ParserDay类。

无论如何要做到这一点?

3 个答案:

答案 0 :(得分:4)

这对我来说非常好。您必须遇到其他问题或未正确/完全粘贴代码。

void Main()
{
    var ser = new XmlSerializer(typeof(ParserSchedule));
    var xml = @"<Schedule>
   <Month name=""March"">
     <Day name=""Monday"" />
   </Month>
   <Month name=""April"">
     <Day name=""Tuesday"" />
     <Day name=""Monday"" />
   </Month>
</Schedule>";

    using (var reader = new StringReader(xml))
    {
        var schedule = (ParserSchedule)ser.Deserialize(reader);
        schedule.Dump(); // LINQPad method to dump object to debug
    }
}

[XmlRoot("Schedule")]
public class ParserSchedule
{
   [XmlElement("Month")]
   public List<ParserMonth> Month{ get; set; } 
}

public class ParserMonth
{
    [XmlAttribute("name")]
    public string Name{ get; set; }

    [XmlElement("Day")]
    public List<ParserDay> Day{ get; set; } 
}

public class ParserDay
{
    [XmlAttribute( "name" )]
    public string Name{ get; set; }        
}

public class Day
{
    private Day() {} // new Day() should fail to compile
}

编码样式注意:您确实应该将您的成员调用为复数public List<ParserDay> Days{ get; set; },以避免混淆。

答案 1 :(得分:2)

你能试试吗?

[XmlRoot("Schedule")]
public class ParserSchedule
{
    [XmlElement("ParserMonth")]
    public ParserMonth[] Months { get; set; } 
}

public class ParserMonth
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("ParserDay")]
    public ParserDay[] Days { get; set; } 
}

public class ParserDay
{
    [XmlAttribute("name")]
    public string Name { get; set; }
}

答案 2 :(得分:0)

使用以下代码:

[XmlRootAttribute( ElementName ="DesiredElement")]