简体   繁体   中英

How to deserialize this xml to objects?

I'm fetching data in the format of this:

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

With the following C# objects:


    [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;
    }

And the following deserializing:

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

But I get the following error: InvalidOperationException: <ReplyUserAccount xmlns='xxx'> was not expected .

I'm a little bit lost as to how to properly deserialize this specific xml data. Any and all help with regards to this is greatly appreciated.

To fix the error, You have to remove xmlns and xsi in xml text before deserialize. You can remove xmlns and xsi like this:

var content = xdoc.ToString();
string strXMLPattern = @"xmlns(:\w+)?=""([^""]+)""|xsi(:\w+)?=""([^""]+)""";
content = Regex.Replace(content, strXMLPattern, "");

Therefore the method should be as follows

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM