Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Xml反序列化为对象时出错-xmlns='';出乎意料_C#_.net_Xml_Serialization_Deserialization - Fatal编程技术网

C# 将Xml反序列化为对象时出错-xmlns='';出乎意料

C# 将Xml反序列化为对象时出错-xmlns='';出乎意料,c#,.net,xml,serialization,deserialization,C#,.net,Xml,Serialization,Deserialization,我在尝试反序列化一些XML时遇到了真正的困难,希望有人能提供一些帮助。我读过很多类似的帖子,但我无法解决这个问题 我正在尝试反序列化XML <register-account success="false"> <user-name>xxxxx</user-name> <password>fghgh</password> <email>test@example.com</email> <err

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

xxxxx
fghgh
test@example.com
120
密码无效
我试图反序列化到的类:

[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;
}
<register-account xmlns=''> was not expected.
[Serializable,XmlRoot(ElementName=“register account”,Namespace=“MyNamespace”)]
[XmlType(“注册账户”)]
公共类注册表帐户响应
{
[XmlAttribute(“成功”)]
公共bool成功{get;set;}
/// 
///获取或设置Tennant电子邮件地址
/// 
[XmlElement(“电子邮件”)]
公共字符串电子邮件{get;set;}
/// 
///获取或设置坦能密码
/// 
[XmlElement(“密码”)]
公共字符串密码{get;set;}
/// 
///获取或设置Tennant用户名
/// 
[XmlElement(“用户名”)]
公共字符串用户名{get;set;}
/// 
///与RegisterAccountRequest相关的租户门户错误
/// 
[XmlElement(“错误”)]
公共QubeError错误;
}
反序列化方法

    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);
        }
    }
publicstatict反序列化(字符串数据),其中T:class
{
如果(数据==null)
{
返回null;
}
if(data.Trim().Length==0)
{
返回null;
}
var ser=新的XmlSerializer(typeof(T));
使用(var sr=新的StringReader(数据))
{
返回(T)序列反序列化(sr);
}
}
反序列化方法调用

var data = Helper.Deserialize<RegisterAccountResponse>(xml);
var data=Helper.Deserialize(xml);
例外情况:

[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;
}
<register-account xmlns=''> was not expected.
XML文档中存在错误(1, 2). ---> System.InvalidOperationException:是 没有预料到。在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

内部异常如下所示:

[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;
}
<register-account xmlns=''> was not expected.
不是预期的。

我发现执行以下操作可以解决这一问题

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

只需去掉
名称空间=

[XmlRoot("register-account"), XmlType("register-account")]
public class RegisterAccountResponse {...}
因为您的xml似乎不在xml名称空间中。另外,
[Serializable]
未被
XmlSerializer
使用

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


另外,为了帮助调用方,您可以将
添加到
反序列化
方法中,因为
XmlSerializer
需要一个公共的无参数构造函数。

这里对我来说没有任何效果

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


请用exmaple检查我的完整答案,因为你的答案恰到好处!我真是太感谢你了,因为我一直在用这个把我的头发扯下来。太感谢你了!关于名称空间的额外信息是我需要的解决方案。您能告诉我为什么类中的“namespace=”是不必要的吗?@gfan,因为问题中的xml不包括该名称空间;xml和模型/反序列化器需要匹配。具体地说,这里没有供参考的
xmlns=“MyNamespace”
,或者
xmlns:someAlias=“MyNamespace”
FYI,这似乎也起到了相反的作用。当需要名称空间时,取消名称空间会导致类似的错误。这是我的解决方案,我使用了
[XmlRoot(ElementName=“RESPONSE”)]
而不是
[XmlRoot(ElementName=“RESPONSE”)]