假设我有这个想象中的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类。
无论如何要做到这一点?
答案 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")]