将 Xml 反序列化为对象时出错 - 不需要 xmlns='' [英] Error Deserializing Xml to Object - xmlns='' was not expected

查看:18
本文介绍了将 Xml 反序列化为对象时出错 - 不需要 xmlns=''的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am having real trouble trying to deserialize some XML and was hoping someone can offer some assistance. I have read a lot of similar posts but I am unable to resolve this.

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

There is an error in XML document (1, 2). ---> System.InvalidOperationException: was not expected. at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

内部异常如下:

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

推荐答案

只需去掉Namespace =:

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

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

since your xml doesn't seem to be in an xml-namespace. Also, [Serializable] isn't used by XmlSerializer.

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

If your xml was using a namespace it would have an xmlns at the root.

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

Also, to help with callers you could add where T : class, new() (the , new() being the addition) to your Deserialize method, since XmlSerializer demands a public parameterless constructor.

这篇关于将 Xml 反序列化为对象时出错 - 不需要 xmlns=''的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆