【问题标题】:How to deserialize this xml to objects?如何将此xml反序列化为对象?
【发布时间】:2020-05-26 21:02:48
【问题描述】:

我正在获取以下格式的数据:

<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: &lt;ReplyUserAccount xmlns='xxx'&gt; was not expected.

对于如何正确反序列化这个特定的 xml 数据,我有点迷茫。非常感谢您对此提供的任何和所有帮助。

【问题讨论】:

  • 你是如何创建课程的?您是否尝试过在 Visual Studio 中使用“将 XML 粘贴为类”功能? (
  • @Neil 我自己创建了它们。我不知道 Visual Studio 中有这样的功能!我去看看谢谢!
  • @Neil 似乎 VS2019 中缺少此功能,并且目前似乎没有任何修复。 developercommunity.visualstudio.com/content/problem/580529/…
  • 我正在使用 Vs2019 社区版(本周的更新),它就在那里(并且有效)。
  • @Neil 你在哪里可以找到选项?

标签: c# xml


【解决方案1】:

要修复错误,您必须在反序列化之前删除 xml 文本中的 xmlnsxsi。您可以像这样删除 xmlnsxsi

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

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2018-10-11
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多