2010-09-15 5 views
0

Je rencontre des problèmes de désérialisation d'un document XML. Le document que je suis en train de désérialiser est la suivante:XmlSerializer.Deserialize problème avec élément racine manquant ou élément non attendu

<slt:CreateGiftRegistryResponse xmlns:slt="http://WWW.example.com/"> 
<slt:Response> 
<slt:ResponseCode>ERROR</slt:ResponseCode> 
<slt:ResponseDescription>Request unsuccessfull null</slt:ResponseDescription> 
</slt:Response></slt:CreateGiftRegistryResponse> 

Ma classe ressemble à ceci:

/// <summary> 
/// response to attempt to add items to a registry 
/// </summary> 
[XmlRoot("CreateGiftRegistryResponse")] 
public class CreateRegistryResponse : ResponseBase 
{ 
    // Constant Declarations 

    // Variable Declarations 

    #region --- Constructors --- 

    public CreateRegistryResponse() 
     : this(String.Empty) { } 

    /// <summary> 
    /// response to attempt to add items to a registry 
    /// </summary> 
    /// <param name="response">xml string</param> 
    public CreateRegistryResponse(string responseXml) 
    { 
     try 
     { 
      Load(responseXml); 
     } 
     catch (Exception ex) 
     { 
      // Report the exception and throw to the caller for handling. 
      ExceptionManager.Publish(ex, 
       "ctor CreateRegistryResponse() failed.", 
       Severity.Fatal); 
      throw; 
     } 
    } 
    #endregion 

    #region --- Properties --- 
    /// <summary> 
    /// structure for the typical response - code and description 
    /// </summary> 
    [XmlElement("Response")] 
    public ResponseWS Response { get; set; } 


    #endregion 

    #region --- Static Methods --- 
    #endregion 

    #region --- CRUD --- 
    #endregion 

    #region --- Validation --- 
    #endregion 

    #region --- Business Methods --- 
    /// <summary> 
    /// Load the web service result string into a Result. 
    /// </summary> 
    public void Load(string response) 
    { 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(CreateRegistryResponse), this.GetExtraTypes()); 
      byte[] byteArray = Encoding.ASCII.GetBytes(response); 
      MemoryStream stream = new MemoryStream(byteArray); 

      // convert the results into a usable format 
      CreateRegistryResponse formattedResponse = serializer.Deserialize(stream) as CreateRegistryResponse; 

      this.Response = formattedResponse.Response; 
      if (formattedResponse.Response.ResponseCode == ResponseCode.SUCCESS.ToString()) 
      { 
       this.IsSuccessful = true; 
      } 


     } 
     catch (Exception ex) 
     { 
      // Report the exception and throw to the caller for handling. 
      ExceptionManager.Publish(ex, 
       "Load() failed. Unable to authenticate user.", 
       Severity.Fatal); 
      throw; 
     } 
     finally 
     { 
      // 
      // TODO: Add clean-up code here, if needed. 
      // 
     } 
    } 

    /// <summary> 
    /// Get an array of types that are possibly contained within this class 
    /// </summary> 
    public Type[] GetExtraTypes() 
    { 
     try 
     { 
      // 
      // TODO: Add code here. 
      // 
      // build an array of possible types within this type. 
      List<Type> types = new List<Type>(); 
      types.Add(typeof(ResponseWS)); 


      return types.ToArray(); 


     } 
     catch (Exception ex) 
     { 
      // Report the exception and throw to the caller for handling. 
      ExceptionManager.Publish(ex, 
       "GetExtraTypes() failed. Unable to return list", 
       Severity.Fatal); 
      throw; 
     } 
    } 
    #endregion 
} 

Lorsque j'utilise ce code, je reçois cette erreur: { "http: //kiosk.surlatable Si je change l'élément XmlRoot pour qu'il contienne aussi l'espace de nommage, mon erreur de modification de l'élément racine est manquante.}

Je pensais que l'un de ceux-ci me donnerait le résultat que je m'attendais, mais ce n'est pas le cas. Quelqu'un peut-il repérer ce qui me manque ici?

Répondre

3

Une approche que j'ai utilisée en essayant de décorer correctement mes classes lors de la désérialisation est d'utiliser XSD.exe pour générer des classes C# basées sur le XSD, puis de comparer la décoration à ma propre classe. À plus d'une occasion, il a mis en lumière des problèmes.

Ouvrez une invite de commande Visual Studio, puis:

xsd /c <filename>.xsd 
+0

XSD.exe était en fait le coupable! Je l'ai utilisé sur la base d'un tutoriel et n'ai pas fait assez de lecture au début pour le comprendre. Le problème était définitivement avec mes décorateurs de classe. Je crois qu'il y avait 2 déclarations de racine. Cela fonctionne maintenant très bien. – mkeller

1

Définissez la propriété Namespace de votre attribut XmlRoot selon l'espace de noms de l'élément XML.

Est-ce un fragment du document XML ou complet? Je ne vois pas la déclaration XML

+0

Merci! Cela était directement lié à mon problème. Le code a été divisé entre plusieurs classes et cette hiérarchie et la façon dont cette réponse xml m'a causé beaucoup de confusion. – mkeller

Questions connexes