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

Posted

技术标签:

【中文标题】将 Xml 反序列化为对象时出错 - xmlns=\'\' 不是预期的【英文标题】:Error Deserializing Xml to Object - xmlns='' was not expected将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的 【发布时间】:2021-03-06 15:31:20 【问题描述】:

我在尝试反序列化某些 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>

我要反序列化的类:

[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.

【问题讨论】:

【参考方案1】:

只需取下Namespace =

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

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

如果您的 xml 使用命名空间,则它的根目录下会有一个 xmlns

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

【讨论】:

马克你看中了!我非常感谢你,因为我一直用这个把头发扯掉。 非常感谢!命名空间的额外信息是我需要的解决方案。 您能否详细说明一下为什么类中的“命名空间=”是不必要的? @gfan 因为问题中的 xml 包含该命名空间; xml 和模型/反序列化器需要匹配。具体来说,没有xmlns="MyNamespace",或者xmlns:someAlias="MyNamespace" 仅供参考,这似乎也以相反的方式工作。当需要命名空间时离开命名空间对我来说会导致类似的错误。【参考方案2】:

这里没有什么对我有用

有效的是确保您尝试将 xml 字符串映射/反序列化为具有与响应的根元素匹配的 XmlRootAttribute 的 C# 类(主类)。

用一个例子检查我的完整答案https://***.com/a/61525536/1594274

【讨论】:

这是我的解决方案,我也有 [XmlRoot(ElementName = "RESPONSE")] 而不是 [XmlRoot(ElementName = "response")]【参考方案3】:

我发现执行以下操作为我解决了这个问题

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

【讨论】:

以上是关于将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 文件反序列化为 C# 类对象时出错

XML 文档中存在错误 (0, 0) - 将 XML 反序列化为对象时出错

将 xml 反序列化为对象时出错:System.FormatException 输入字符串格式不正确

将 xml 反序列化为 c# 对象时,XML 文档 (2, 2) 出现错误

将 ODATA xml 序列化/反序列化为 C# 对象

使用 DataContractSerializer 反序列化 XML 时出错