Reputation: 17915
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
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
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