将嵌套XML反序列化为类

时间:2012-07-02 19:43:09

标签: c# xml deserialization

我有以下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反序列化为一个对象。

1 个答案:

答案 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}
}