Search code examples
c#xmlweb-serviceswcf

Deserialize To Object


I am trying to deserialize XML to C# object.

My XML is as:

<StaffingOrder xmlns='StaffinfOrderNamespace' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <OrderId idOwner="VMSAccess">
      <IdValue name='RequisitionID'>1</IdValue>
      <IdValue name='KellyBranch'>3319</IdValue>
   </OrderId>
</StaffingOrder>

My Class is as:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[XmlRoot("StaffingOrder")]
public class OrderId
{

    [XmlElement(ElementName = "RequisitionID")]
    public int RequisitionID { get; set; }

    [XmlElement(ElementName = "KellyBranch")]
    public int KellyBranch { get; set; }
}

My WCF Service contract is as:

 [OperationContract]
 [WebInvoke(Method = "POST", UriTemplate = "UploadOrderDocument",
            RequestFormat = WebMessageFormat.Xml, 
            ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Bare)]
 [XmlSerializerFormat]
 OrderId UploadOrderDocument(string hrXML);

I am trying to Deserialize as:

public OrderId UploadOrderDocument(string hrXMLString)
{

    OrderId orderId = new OrderId();

    using (StringReader sr = new StringReader(hrXMLString))
    {
        XmlSerializer xs = new XmlSerializer(typeof(OrderId));
        orderId = (OrderId)xs.Deserialize(sr);
        var temp = orderId.RequisitionID;
    }

    return orderId;
}

I am not getting any error while deserializing, but not getting any value of RequisitionID.


Solution

  • Your classes don't seem to bare much resemblance to the XML you're trying to deserialise. If you were to create XML from the classes you've created, it would look something like this:

    <StaffingOrder>
        <RequisitionID>1</RequisitionID>
        <KellyBranch>3319</KellyBranch>
    </StaffingOrder>
    

    What you want are classes that actually represent the XML structure:

    [XmlRoot(Namespace = "StaffinfOrderNamespace")]
    public class StaffingOrder
    {    
        public OrderId OrderId { get; set; }    
    }
    
    public class OrderId
    {
        [XmlAttribute("idOwner")]
        public string IdOwner { get; set; }
    
        [XmlElement("IdValue")]
        public List<IdValue> IdValues { get; set; }
    }
    
    public class IdValue
    {
        [XmlAttribute("name")]
        public string Name { get; set; }
    
        [XmlText]
        public int Value { get; set; }
    }
    

    See this fiddle for a working demo.