错误反序列化Xml到对象 – xmlns =''不是预期的

我在尝试反序列化一些XML时遇到了麻烦,希望有人能提供一些帮助。 我读了很多类似的post,但我无法解决这个问题。

XML我正试图反序列化

<register-account success="false"> <user-name>xxxxx</user-name> <password>fghgh</password> <email>test@example.com</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. 

只需取下Namespace =

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

因为你的xml似乎不在xml命名空间中。 此外, XmlSerializer不使用[Serializable]

如果你的xml使用了一个命名空间,它将在根目录下有一个xmlns

另外,为了帮助调用者,你可以where T : class, new()你的Deserialize方法中添加where T : class, new(), new()作为添加),因为XmlSerializer需要一个公共无参数的构造函数。

我发现为我做了以下修复

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