katit
katit

Reputation: 17915

XmlSerializer. How do I deserialize following structure?

Web service returns document that looks like so:

<CarrierService.GetAlerts>
 <ResponseDO>
  <status>APPROVED</status>
  <action>OK</action>
  <code>SFW00542</code>
  <displayMsg/>
  <techMsg/>
 </ResponseDO>
 <AlertList count="1">
  <AlertItem>
   <docketNumber>MC758</docketNumber>
   <dotNumber>17952</dotNumber>
   <Change>
    <Field>rating</Field>
    <From>Conditional</From>
    <To>Satisfactory</To>
   </Change>
   <Change>
    <Field>rateDate</Field>
    <From>2010-08-31</From>
    <To>2010-12-20</To>
   </Change>
  </AlertItem>
 </AlertList>
</CarrierService.GetAlerts>

I'm using XmlSerializer and this is how my mapped classes look:

[XmlRoot("CarrierService.GetAlerts")] 
public class GetAlertsResponse
{
    [XmlElement(ElementName = "ResponseDO")]
    public ResponseDo ResponseDo { get; set; }

    [XmlArray(ElementName = "AlertList")]
    public List<AlertItem> AlertList { get; set; }
}


public class AlertItem
{
    [XmlElement(ElementName = "docketNumber")]
    public string DocketNumber { get; set; }

    [XmlElement(ElementName = "dotNumber")]
    public string DOTNumber { get; set; }
}

I have problem with AlertItem.Change. It repeats inside AlertItem and it's not enclosed into "ChangeList".

How do I go about deserializing those items?

Upvotes: 1

Views: 210

Answers (2)

Matt B-L
Matt B-L

Reputation: 253

If you want to create a list of changes, this would work

<CarrierService.GetAlerts>
 <ResponseDO>
  <status>APPROVED</status>
  <action>OK</action>
  <code>SFW00542</code>
  <displayMsg/>
  <techMsg/>
 </ResponseDO>
 <AlertList count="1">
  <AlertItem>
   <docketNumber>MC758</docketNumber>
   <dotNumber>17952</dotNumber>
<Changes>
   <Change>
    <Field>rating</Field>
    <From>Conditional</From>
    <To>Satisfactory</To>
   </Change>
   <Change>
    <Field>rateDate</Field>
    <From>2010-08-31</From>
    <To>2010-12-20</To>
   </Change>
</Changes>
  </AlertItem>
 </AlertList>
</CarrierService.GetAlerts>

and for the class

[XmlRoot("CarrierService.GetAlerts")] 
public class GetAlertsResponse
{
    [XmlElement(ElementName = "ResponseDO")]
    public ResponseDo ResponseDo { get; set; }

    [XmlArray(ElementName = "AlertList")]
    public List<AlertItem> AlertList { get; set; }
}
public class AlertItem
{
    [XmlElement(ElementName = "docketNumber")]
    public string DocketNumber { get; set; }

    [XmlElement(ElementName = "dotNumber")]
    public string DOTNumber { get; set; }

    [XmlElement(ElementName = "Changes")]
    public Changes Changes { get; set; }
}
public class Changes
{
    [XmlElement(ElementName = "Change")]
    public  List<Change> ChangesList { get; set; }
}
public class Change
{
    [XmlElement("Field")]
    public string Field {get; set;}

    [XmlElement("From")]
    public string From {get; set;}

    [XmlElement("To")]
    public string To {get; set;}
}

Upvotes: 0

Az Za
Az Za

Reputation: 394

You can cheat a little bit and use XmlElement on a List, and the XmlSerializer will happily comply.

public class AlertItem
{
    [XmlElement(ElementName = "docketNumber")]
    public string DocketNumber { get; set; }

    [XmlElement(ElementName = "dotNumber")]
    public string DOTNumber { get; set; }

    [XmlElement("Change")]
    public List<Change> Changes {get; set;}
}

public class Change
{
    [XmlElement("Field")]
    public string Field {get; set;}

    [XmlElement("From")]
    public string From {get; set;}

    [XmlElement("To")]
    public string To {get; set;}
}

Upvotes: 2

Related Questions