2011-02-03 48 views
38

Estoy teniendo problemas reales para tratar de deserializar algunos XML y esperaba que alguien pudiera ofrecer ayuda. He leído muchas publicaciones similares pero no puedo resolver esto.Error al deserializar Xml al objeto - xmlns = '' no se esperaba

XML que estoy tratando de deserializar

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

Clase Estoy tratando de deserializar a:

[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étodo Deserialización

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

Deserialización método de llamada de

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

Excepción:

Hay un error en el documento XML (1, 2 ). ---> System.InvalidOperationException: era no esperado. en Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

excepción interna de la siguiente manera:

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

Respuesta

48

Simplemente despegue el Namespace =:

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

ya que su xml no parece estar en un espacio de nombres xml. Además, [Serializable] no es utilizado por XmlSerializer.

Si su xml estaba usando un espacio de nombres, tendría un xmlns en la raíz.

Además, para ayudar a las personas que llaman se podría añadir where T : class, new() (el , new() es la adición) a su método Deserialize, ya XmlSerializer exige un constructor sin parámetros pública.

+1

Marc, eres perfecto! No puedo agradecerte lo suficiente ya que me había estado arrancando los pelos con este. – ProNotion

+0

¡Muchas gracias! La información adicional en el espacio de nombres era la solución que necesitaba. – varagrawal

+0

¿Podría decirnos más acerca de por qué el "Espacio de nombres =" en la clase es innecesario? – gfan

-1

encontré haciendo lo siguiente fijada por mí

if (elem.Attribute(XNamespace.Xmlns + "xsi") == null) { 
    elem.Add(new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance")); 
} 

if (elem.Attribute(XNamespace.Xmlns + "xsd") == null) { 
    elem.Add(new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema")); 
} 
Cuestiones relacionadas