2011-06-15 4 views
2

J'ai du XML que j'essaye de désérialiser. L'objet Kronos_WCF se désérialise correctement mais pas les objets Response. Y a-t-il une technique de désérialisation récursive qui me manque?Désérialisation récursive XML

Voici le XML que je suis en train de désérialiser:

<?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> 

Voici mon désérialiseur:

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

Voici une capture d'écran de ce que je vois dans VS2010:

enter image description here

Voici le code des classes générées en utilisant 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; 
     } 
    } 
} 

Toute aide serait appréciée.

+0

Il serait utile si vous pouvez publier le code pour la classe 'Kronos_WFC'. –

+0

et la classe 'Response' – wal

+0

J'ai ajouté les classes – Cyberdrew

Répondre

1

Status défini dans Response a le mauvais attribut

il devrait être

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

et au lieu, il est en fait

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

de sorte que le désérialiseur xml recherche

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

Cela vous permettra au moins de désérialiser Response.Status

Il ne ressemble pas à ce que l'extrait xml correspond à la définition de classe.

+0

J'ai généré ceci à partir d'un XSD fourni par le fournisseur de l'API. Existe-t-il un moyen de définir cela lors de la génération des classes à l'aide de XSD.exe ou doit-il simplement être modifié manuellement? Merci. – Cyberdrew

+1

Si le xsd provient d'un fournisseur et que la réponse xml provient du produit du même fournisseur, j'en parlerais au vendeur. –

+1

@Cyberdrew re: XSD Je ne sais pas. Au lieu de cela, je voudrais modifier le XSD fourni pour correspondre au xml que vous recevez afin que les classes correctes soient * générées. Je voudrais également demander au vendeur pourquoi il y a une discordance dans le XSD et l'exemple xml. – wal

1

Les attributs de réponse du fichier xml ne semblent pas correspondre à ceux présents dans votre classe.

+0

'Status' est présent – wal

+0

Je me suis aperçu de moi-même mais ne peuplerait-il pas ceux qu'il trouve? – Cyberdrew