C# 将Xml反序列化为对象时出错-xmlns='';出乎意料
我在尝试反序列化一些XML时遇到了真正的困难,希望有人能提供一些帮助。我读过很多类似的帖子,但我无法解决这个问题 我正在尝试反序列化XMLC# 将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
<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”)]