2016-06-07 51 views
2

我在將一些XML反序列化到對象列表時遇到了一些問題,在調試過程中檢查DateAndTimeSlot時總是獲得計數0並在該「原始數據」內。將XML反序列化到嵌套對象列表返回計數0

不幸的是我不能改變這些元素的名稱。

但是,當檢查XML時,我會返回XML中的DateAndTimeslot對象。

與其他對象列表我似乎很好,沒有包含名稱空間。

我錯過了什麼?

C#代碼:

[XmlRoot("AppointmentAvailabilityStatusResponse")] 
    public class CheckAppointmentAvailabilityContainer 
    { 
     [XmlElement("AppointmentAvailabilityStatusResult")] 
     public AppointmentAvailabilityStatus appointmentAvailabilityStatus { get; set; } 
    } 
    [XmlRoot("AppointmentAvailabilityStatusResult", Namespace = "Appointments")] 
    public class AppointmentAvailabilityStatus 
    { 
     [XmlArray("DateAndTimeSlot", Namespace = "Appointments")] 
     [XmlArrayItem(typeof(DateAndTimeslot))] 
     public DateAndTimeSlots DateAndTimeSlot { get; set; } 
     [XmlElement("RequestedStatus")] 
     public int RequestedStatus { get; set; } 
    } 
    [XmlRoot(ElementName = "DateAndTimeSlot")] 
    [XmlType("a")] 
    public class DateAndTimeSlots : List<DateAndTimeslot> { } 

    [XmlRoot(ElementName = "DateAndTimeslot", Namespace = "Appointments.TO")] 
    [XmlType("b")] // if included this renames the node to "b" for some reason 
    public class DateAndTimeslot 
    { 
     [XmlElement("Date")] 
     public string Date { get; set; } 
     [XmlElement("TimeSlot")] 
     public string TimeSlot { get; set; } 
    } 

縮短返回的XML,我想完全deserialise。

<AppointmentAvailabilityStatusResponse> 
    <AppointmentAvailabilityStatusResult xmlns:a="Appointments" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <a:DateAndTimeSlot xmlns:b="Appointments.TO"> 
     <b:DateAndTimeslot> 
     <b:Date>14/07/2016</b:Date> 
     <b:TimeSlot>AM</b:TimeSlot> 
     </b:DateAndTimeslot> 
     <b:DateAndTimeslot> 
     <b:Date>14/07/2016</b:Date> 
     <b:TimeSlot>PM</b:TimeSlot> 
     </b:DateAndTimeslot> 
    </a:DateAndTimeSlot> 
    <a:RequestStatus>0</a:RequestStatus> 
    </AppointmentAvailabilityStatusResult> 
</AppointmentAvailabilityStatusResponse> 

XML如果我連載虛擬對象 - 其中一些我想要的差異整頓,不知道該命名空間是必要的deserialisation雖然

<AppointmentAvailabilityStatusResponse> 
<AppointmentAvailabilityStatusResult> 
<DateAndTimeSlot xmlns=\"Appointments\"> 
<DateAndTimeslot> 
<Date xmlns=\"Appointments.TO\">today</Date> 
<TimeSlot xmlns=\"Appointments.TO\">now</TimeSlot> 
</DateAndTimeslot> 
</DateAndTimeSlot> 
<RequestedStatus xmlns=\"Appointments\">0</RequestedStatus> 
</AppointmentAvailabilityStatusResult> 
</AppointmentAvailabilityStatusResponse> 

解串器

public static T DeserializeThis<T>(string cleanXml) 
     { 
      //string cleanXml = RemoveBom(dirtyXml); 
      bool check = cleanXml.TrimStart().StartsWith("<"); 
      if (!string.IsNullOrEmpty(cleanXml) && cleanXml.TrimStart().StartsWith("<")) 
      { 
       try 
       { 
        XmlSerializer xs = new XmlSerializer(typeof(T)); 
        MatchCollection mc = Regex.Matches(cleanXml, @"</?(\d\w+)"); 
        List<string> elements = new List<string>(); 

        foreach (Match m in mc) 
        { 
         string cpval = m.Groups[1].Value; 
         if (!elements.Contains(cpval)) { elements.Add(cpval); } 
        } 

        foreach (string e in elements) 
        { 
         cleanXml = cleanXml.Replace(e, "d_" + e); 
        } 

        using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(cleanXml))) 
        { 
         using (StringReader sr = new StringReader(cleanXml)) 
         { 
          return (T)xs.Deserialize(sr); 
         } 
        } 
       } 
       catch(XmlException x) 
       { 
        var obj = (T)Activator.CreateInstance(typeof(T)); 
        Type type = obj.GetType(); 
        return (T)obj; 
       } 
      } 
      else 
      { 
       var obj = (T)Activator.CreateInstance(typeof(T)); 
       Type type = obj.GetType(); 
       // add in the generic derived class property search and assign 
       return (T)obj; 
      } 
     } 
+1

包含的代碼,你實際上是試圖將XML反序列化到所提供的對象圖 - 我的第一個猜測是你錯過了正確的'NamespaceManager' – Jamiec

+0

可能是(包括我使用的derserialiser),但是,我不認爲我需要在解串時使用命名空間?認爲這只是在發送XML時沒有收到序列化。 – PurpleSmurph

+1

通過'http:// xmltocsharp.azurewebsites.net'解析你的'xml'來獲得強類型的C#對象。 –

回答

0

感謝上面評論過的人 - 我終於找到了工作。刪除XmlArray但不包括AnonymousIsNullable屬性似乎是問題,雖然我不確定爲什麼它可以與我具有的所有其他功能一起使用,但也可能不需要存在serializable

工人階級結構減去容器,並沒有改變:

[Serializable()] 
    [XmlType(AnonymousType = true, Namespace = "")] 
    public class AppointmentAvailabilityStatusResult : WebserviceMessage 
    { 
     [XmlElement("DateAndTimeSlot", Namespace = "Appointments")] 
     public DateAndTimeSlot DateAndTimeSlot { get; set; } 

     [XmlElement("RequestedStatus")] 
     public int RequestedStatus { get; set; } 
    } 
    [Serializable()] 
    [XmlType(AnonymousType = true, Namespace = "Appointments")] 
    [XmlRoot(ElementName = "DateAndTimeSlot",Namespace = "Appointments", IsNullable = false)] 
    public class DateAndTimeSlot 
    { 
     [XmlElement(ElementName = "DateAndTimeslot", Namespace = "Appointments.TO")] 
     public List<DateAndTimeslot> DateAndTimeslot { get; set; } 
    } 

    [Serializable()] 
    [XmlType(AnonymousType = true, Namespace = "Appointments.TO")] 
    [XmlRoot(Namespace = "Appointments.TO", IsNullable = false)] 
    public class DateAndTimeslot 
    { 
     [XmlElement("Date")] 
     public string Date { get; set; } 
     [XmlElement("TimeSlot")] 
     public string TimeSlot { get; set; } 
    }