2011-06-15 56 views
2

我有一些XML,我嘗試反序列化。 Kronos_WCF對象很好地反序列化,但Response對象卻沒有。是否有一些我缺少的遞歸反序列化方法?XML遞歸反序列

這裏是XML我想反序列化:

<?xml version='1.0' encoding='UTF-8' ?> 
<Kronos_WFC Version="1.0" WFCVersion="6.2.0.4" TimeStamp="6/15/2011 9:15AM GMT-04:00"> 
<Response Status="Success" Timeout="1800" PersonKey="-1" Object="System" UserName="User" Action="Logon" PersonNumber="User"> 
</Response> 
<Response Status="Success" Object="System" UserName="User" Action="Logoff"> 
</Response> 
</Kronos_WFC> 

這裏是我的解串器:

public static T Deserialize<T>(this string xml) 
{ 
    var ser = new XmlSerializer(typeof (T)); 
    object obj; 
    using (var stringReader = new StringReader(xml)) 
    { 
     using (var xmlReader = new XmlTextReader(stringReader)) 
     { 
      obj = ser.Deserialize(xmlReader); 
     } 
    } 
    return (T) obj; 
} 

這是我在VS2010我看到的屏幕截圖:

enter image description here

下面是使用XSD.EXE生成來自類的代碼:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[XmlRootAttribute("Kronos_WFC", Namespace = "", IsNullable = false)] 
public class Kronos_WFCType 
{ 

    private object[] m_itemsField; 

    private string m_timeStampField; 

    private string m_versionField; 

    private string m_wFcVersionField; 

    /// <remarks/> 
    [XmlElementAttribute("Request", typeof(RequestType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [XmlElementAttribute("Response", typeof(ResponseType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [XmlElementAttribute("Transaction", typeof(TransactionType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public object[] Items 
    { 
     get 
     { 
      return m_itemsField; 
     } 
     set 
     { 
      m_itemsField = value; 
     } 
    } 

    [XmlAttributeAttribute()] 
    public string TimeStamp 
    { 
     get 
     { 
      return m_timeStampField; 
     } 
     set 
     { 
      m_timeStampField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string Version 
    { 
     get 
     { 
      return m_versionField; 
     } 
     set 
     { 
      m_versionField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlAttributeAttribute()] 
    public string WFCVersion 
    { 
     get 
     { 
      return m_wFcVersionField; 
     } 
     set 
     { 
      m_wFcVersionField = value; 
     } 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
public class ResponseType 
{ 

    private string messageField; 

    private string sequenceField; 

    private string statusField; 

    private string transactionSequenceField; 

    /// <remarks/> 
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string Message 
    { 
     get 
     { 
      return messageField; 
     } 
     set 
     { 
      messageField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string Sequence 
    { 
     get 
     { 
      return sequenceField; 
     } 
     set 
     { 
      sequenceField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string Status 
    { 
     get 
     { 
      return statusField; 
     } 
     set 
     { 
      statusField = value; 
     } 
    } 

    /// <remarks/> 
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string TransactionSequence 
    { 
     get 
     { 
      return transactionSequenceField; 
     } 
     set 
     { 
      transactionSequenceField = value; 
     } 
    } 
} 

任何幫助,將不勝感激。

+0

這將有助於如果你能張貼'Kronos_WFC'類的代碼。 – 2011-06-15 13:38:10

+0

和'Response'類 – wal 2011-06-15 13:39:00

+0

我已經添加了類 – Cyberdrew 2011-06-15 13:49:59

回答

1

Status有錯誤的屬性

應該

[XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public string Status 

,而是它實際上是

[XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 

因此XML解串器正在尋找

<Response><Status>Success</Status></Response> 

這將至少允許您反序列化Response.Status

它看起來不像xml片段與類定義相匹配。

+0

我是從API供應商提供的XSD生成的。有沒有辦法在使用XSD.exe生成類時設置它,還是隻需要手動更改?謝謝。 – Cyberdrew 2011-06-15 14:42:02

+1

如果XSD是從供應商和XML響應來自同一廠商的產品,我想談談它的供應商。 – 2011-06-15 14:44:30

+1

@Cyber​​drew重:XSD我不知道。相反,我會修改提供的XSD以匹配您接收的xml,以便生成正確的類*。我還會問供應商爲什麼在XSD和示例xml中存在不匹配。 – wal 2011-06-15 14:45:23

1

的響應從XML屬性似乎並不匹配那些出現在你的班級。在Response定義

+0

'Status' is present – wal 2011-06-15 14:03:18

+0

我注意到我自己,但它不會填充它找到的那些? – Cyberdrew 2011-06-15 14:04:36