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; }
}

それとももっと良いアプローチがありますか?

編集:与えられたものは1つだけ、そして1つeventだけを持っています。私の質問のために、私のタイプが有効であると仮定します。ネストされたXMLをオブジェクトに逆シリアル化しようとしています。idrant

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 に答える