错误反序列化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")); }