c# - 如何将此xml反序列化为对象?
问题描述
我正在以以下格式获取数据:
<ReplyUserAccount xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" requestid="" version="1.0" xmlns="url">
<Sender partnerid="xx">xx</Sender>
<Users>
<User method="GET" ResultCode="OK" Description="">
<Guid>xx</Guid>
<FirstName>xx</FirstName>
<LastName>xx</LastName>
<Phone>xx</Phone>
<Mobile>xx</Mobile>
<Email>xx</Email>
<EmplNo>xx</EmplNo>
<TacPermission />
<InvPermission>xx</InvPermission>
<CustomerId>xx</CustomerId>
</User>
</Users>
</ReplyUserAccount>
使用以下 C# 对象:
[XmlRoot("ReplyUserAccount")]
public class ReplyUserAccount
{
[XmlElement("Users")]
public Users Users{ get; set; }
}
[XmlType("Users")]
public class Users
{
[XmlElement("User")]
public List<User> UserList{ get; set; }
}
[XmlType("User")]
public class User
{
[XmlElement("EmplNo")]
public string Id{ get; set; }
[XmlElement("Guid")]
public string Guid { get; set; } = null;
[XmlElement("Email")]
public string Email { get; set; }
[XmlElement("FirstName")]
public string FirstName { get; set; }
[XmlElement("LastName")]
public string LastName { get; set; }
public bool Active { get; set; } = true;
public string PhoneNumber { get; set; } = null;
}
以及以下反序列化:
var result = await httpClient.GetAsync(url);
var xdoc = XDocument.Parse(await result.Content.ReadAsStringAsync());
XmlSerializer serializer = new XmlSerializer(typeof(ReplyUserAccount));
var content = xdoc.ToString();
TextReader reader = new StringReader(content);
var res = (ReplyUserAccount)serializer.Deserialize(reader);
但我收到以下错误:
InvalidOperationException: <ReplyUserAccount xmlns='xxx'> was not expected
.
对于如何正确反序列化这个特定的 xml 数据,我有点迷茫。非常感谢您对此提供的任何和所有帮助。
解决方案
要修复错误,您必须在反序列化之前删除xml 文本中的xmlns和xsi。您可以像这样删除xmlns和xsi:
var content = xdoc.ToString();
string strXMLPattern = @"xmlns(:\w+)?=""([^""]+)""|xsi(:\w+)?=""([^""]+)""";
content = Regex.Replace(content, strXMLPattern, "");
因此方法应该如下
var result = await httpClient.GetAsync(url);
var xdoc = XDocument.Parse(await result.Content.ReadAsStringAsync());
XmlSerializer serializer = new XmlSerializer(typeof(ReplyUserAccount));
var content = xdoc.ToString();
string strXMLPattern = @"xmlns(:\w+)?=""([^""]+)""|xsi(:\w+)?=""([^""]+)""";
content = Regex.Replace(content, strXMLPattern, "");
TextReader reader = new StringReader(content);
var res = (ReplyUserAccount)serializer.Deserialize(reader);
推荐阅读
- sql - SQL 从一个条目中选择两列
- java - 生成 6 位 UNIQUE 数字并确保它与 Java 不重复
- azure - 我可以从 PowerShell 为 publicClient 或 spa 设置 redirectUris 吗?
- python - np.insert 问题。我无法插入所有字符串(python3.7;numpy1.19.2)
- bash - 如何从顺序值中获取计数
- sql - 如何根据关系组合多行数据
- php - 加载 opcache.so 失败:无法打开共享对象文件
- jira - Jira 自托管如何限制用户
- python - self.after() 函数使 TKinter 程序崩溃
- bash - 跟踪日志文件并将行以 100 行批量发送到 curl