2011-02-03 8 views
38

У меня возникли проблемы с десериализацией некоторого XML и я надеюсь, что кто-то может оказать некоторую помощь. Я прочитал много подобных сообщений, но я не могу это решить.Ошибка Deserializing Xml to Object - xmlns = '' не ожидалось

XML Я пытаюсь десериализации

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

класс Я пытаюсь десериализации к:

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

десериализации метод

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

Десериализация Метод вызова

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

Исключение:

Существует ошибка в XML-документе (1, 2). ---> System.InvalidOperationException: был не ожидал. в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

Внутренняя Exception следующим образом:

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

ответ

48

Просто снимите Namespace =:

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

поскольку ваш xml, кажется, не находится в пространстве имен xml. Кроме того, [Serializable] не используется XmlSerializer.

Если ваш xml использовал пространство имен, в корне будет xmlns.

Кроме того, чтобы помочь с абонентами, вы можете добавить where T : class, new() (, new() является дополнение) к вашему методу Deserialize, поскольку XmlSerializer требует открытого конструктора без параметров.

+1

Марк, на котором вы были на месте! Я не могу поблагодарить вас достаточно, так как я срывал волосы с этим. – ProNotion

+0

Большое вам спасибо! Необходимая информация о пространстве имен была для меня необходимой. – varagrawal

+0

Не могли бы вы рассказать больше о том, почему «Namespace =» в классе бесполезно? – gfan

-1

я нашел делает следующее исправил для меня

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")); 
} 
Смежные вопросы