2011-02-03 162 views
38

我在尝试反序列化一些XML时遇到了麻烦,并希望有人能提供一些帮助。我读过很多类似的帖子,但我无法解决这个问题。错误反序列化Xml到对象 - 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()

内部异常,如下所示:

<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 2011-02-03 10:51:04

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