2

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

4

1 回答 1

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}
}
于 2012-07-02T19:54:34.260 回答