我有以下XML:
<Root>
<EventSet>
<Event>
<id>12345</id>
<rant>
<localTime>
<dst>true</dst>
<time>7/2/2012 14:30</time>
</localtime>
<randomRant>
<random>to illustrate point</random>
<rant>help me!</rant>
</randomRant>
</rant>
</Event>
<Event>/*another event*/</Event>
<Event>/*another event*/</Event> //etc
</EventSet>
</Root>
我想将其映射到:
[Serializable]
public class Events
{
public List<Event> events { get; set; }
}
[Serializable]
public class Event
{
public int id { get; set; }
public Rant rant { get; set; } //this is where I get confused
}
问题:如何在<rant>
内序列化代码?在子标签没有子级之前,我是否继续创建父级的序列化类?例如,下面:
[Serializable]
public class Rant
{
public LocalTime localTime { get; set; }
public RandomRant randomRant { get; set; }
}
[Serializable]
public class LocalTime
{
public bool dst { get; set; }
public DateTime time { get; set; }
}
[Serializable]
public class RandomRant
{
public string random { get; set; }
public string rant { get; set; }
}
或者有更好的方法吗?
编辑:给定的event
只有一个id
,只有一个rant
。为了我的问题,假设我的类型是有效的。我希望将嵌套的XML反序列化为一个对象。
答案 0 :(得分:3)
你给我的例子似乎很好。 至于时间值,示例中的日期格式与xsd:dateTime不兼容,所以你不能只做
public DateTime time { get; set; }
这不会被序列化。虽然您可以使用自定义XmlSerializer来破解它,但更简单的方法是使用:
[XmlIgnore]
public DateTime _time {
get { return DateTime.ParseExact(this.time, "MM/dd/YYYY HH:mm", CultureInfo.InvariantCulture);} // or use some specific culture here.
}
[XmlElement]
public string time { get; set; }
更新:
public List<Event> events
将被解除/序列化为:
<events>
<Event></Event>
<Event></Event>
<Event></Event>
</events>
您可以将其设为:
[XmlElement("Event")]
public List<Event> events {get; set}
并将序列化为
<Event></Event>
<Event></Event>
<Event></Event>
没有包装。
或者,使用:
[XmlArray("EventSet")]
[XmlArrayItem("Event")]
public List<Event> events {get; set}
将按照示例
中的描述进行序列化<EventSet>
<Event></Event>
<Event></Event>
</EventSet>
当然还有根元素:
[XmlRoot("Root")]
public class RootElement{
[XmlArray("EventSet")]
[XmlArrayItem("Event")]
public List<Event> events {get; set}
}