Gurkang
Gurkang

Reputation: 155

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.

Upvotes: 1

Views: 146

Answers (1)

Hidayet R. Colkusu
Hidayet R. Colkusu

Reputation: 384

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

Upvotes: 1

Related Questions