web-dev-qa-db-fra.com

Erreur de désérialisation de Xml en objet - xmlns = '' n'était pas attendu

J'ai de la difficulté à essayer de désérialiser du XML et j'espérais que quelqu'un puisse offrir de l'aide. J'ai lu beaucoup de messages similaires mais je ne peux pas résoudre ce problème.

XML que j'essaye de désérialiser

<register-account success="false">
  <user-name>xxxxx</user-name>
  <password>fghgh</password>
  <email>[email protected]</email>
  <error>
    <errorcode>120</errorcode>
    <errormessage>The password is invalid</errormessage>
  </error>
</register-account>

Classe que j'essaie de désérialiser pour:

[Serializable, XmlRoot(ElementName = "register-account", Namespace = "MyNamespace")]
[XmlType("register-account")]
public class RegisterAccountResponse
{
    [XmlAttribute("success")]
    public bool Success { get; set; } 

    /// <summary>
    /// Gets or sets the Tennant email address
    /// </summary>
    [XmlElement("email")]
    public string Email { get; set; }

    /// <summary>
    /// Gets or sets the tennant password
    /// </summary>
    [XmlElement("password")]
    public string Password { get; set; }

    /// <summary>
    /// Gets or sets the Tennant username
    /// </summary>
    [XmlElement("user-name")]
    public string Username { get; set; }

    /// <summary>
    /// A Tenant Portal error relating to the RegisterAccountRequest
    /// </summary>
    [XmlElement("error")]
    public QubeError Error;
}

Méthode de désérialisation

    public static T Deserialize<T>(string data) where T : class
    {
        if (data == null)
        {
            return null;
        }

        if (data.Trim().Length == 0)
        {
            return null;
        }

        var ser = new XmlSerializer(typeof(T));

        using (var sr = new StringReader(data))
        {
            return (T)ser.Deserialize(sr);
        }
    }

Appel de méthode de désérialisation

var data = Helper.Deserialize<RegisterAccountResponse>(xml);

Exception:

Il y a une erreur dans le document XML (1, 2). ---> System.InvalidOperationException: n'était pas attendu. à Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data ()

Exception interne comme suit:

<register-account xmlns=''> was not expected.
42
ProNotion

Retirez simplement le Namespace =:

[XmlRoot("register-account"), XmlType("register-account")]
public class RegisterAccountResponse {...}

puisque votre xml ne semble pas être dans un espace de noms xml. De plus, [Serializable] N'est pas utilisé par XmlSerializer.

Si votre xml utilisait un espace de noms, il aurait un xmlns à la racine.

De plus, pour aider les appelants, vous pouvez ajouter where T : class, new() (la , new() étant l'addition) à votre méthode Deserialize, car XmlSerializer requiert un public sans paramètre constructeur.

49
Marc Gravell