将Xml反序列化为对象时出错 - 不期望xmlns =''

Pro*_*ion 42 .net c# xml serialization deserialization

我在尝试反序列化某些XML时遇到了麻烦,希望有人可以提供一些帮助.我已经阅读了很多类似的帖子,但我无法解决这个问题.

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>
Run Code Online (Sandbox Code Playgroud)

我正在尝试将反序列化为:

[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;
}
Run Code Online (Sandbox Code Playgroud)

反序列化方法

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

反序列化方法调用

var data = Helper.Deserialize<RegisterAccountResponse>(xml);
Run Code Online (Sandbox Code Playgroud)

例外:

XML文档中存在错误(1,2).---> System.InvalidOperationException:没想到.在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

内部例外情况如下:

<register-account xmlns=''> was not expected.
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 49

简单地脱掉Namespace =:

[XmlRoot("register-account"), XmlType("register-account")]
public class RegisterAccountResponse {...}
Run Code Online (Sandbox Code Playgroud)

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

如果您的xml使用的是命名空间,那么它将拥有一个xmlns根.

此外,为了帮助调用者,您可以向方法添加where T : class, new()(, new()作为添加)Deserialize,因为XmlSerializer需要公共无参数构造函数.

  • 马克,你说得对!我对你的感激之情无以言表,因为我一直在为这个而抓狂。 (2认同)