Error deserialising XML response with same xsi:type (The specified type was not recognized)

62 views Asked by At

I have a query response from SalesForce and I am trying to deserialize it to my model. The problem is that the result has the xsi:type="QueryResult" but also LP_QuoteInformation has xsi:type="QueryResult".

So when deserializing my model I get the following error:

An unhandled exception was thrown by the application.","Exception":"System.InvalidOperationException: There is an error in XML document (1, 1362).\n ---> System.InvalidOperationException: The specified type was not recognized: name='QueryResult', namespace='urn:partner.soap.sforce.com', at <LP_QuoteInformation__r xmlns='urn:sobject.partner.soap.sforce.com'>.

Example of the response:

<result xsi:type="QueryResult">
    <done>true</done>
    <records xsi:type="sf:sObject">
        <sf:type>Type</sf:type>
        <sf:Id xsi:nil="true"/>
        <sf:Company>382</sf:Company>
        <sf:Email>[email protected]</sf:Email>
        <sf:FirstName>f29c6b</sf:FirstName>
        <sf:LastName>0ed736</sf:LastName>
        <sf:LP_Segment__c>SME Direct 1-5</sf:LP_Segment__c>
        <sf:LP_CountryCode__c>PT</sf:LP_CountryCode__c>
        <sf:LP_QuoteInformation__r xsi:type="QueryResult">
            <done>true</done>
            <queryLocator xsi:nil="true"/>
            <records xsi:type="sf:sObject">
            </records>
            <size>1</size>
        </sf:LP_QuoteInformation__r>
    </records>
    <size>1</size>
</result>

My model:

[XmlRoot(ElementName = "result", Namespace = "urn:partner.soap.sforce.com")]
[XmlType(TypeName = "QueryResult")]
public class SalesForceGetLeadResult
{
    [XmlElement(ElementName = "done", Namespace = "urn:partner.soap.sforce.com")]
    public bool Done { get; set; }

    [XmlElement(ElementName = "records", Namespace = "urn:partner.soap.sforce.com")]
    public SalesForceGetLeadResultRecord SalesForceGetLeadResultRecord { get; set; }
}

[XmlRoot(ElementName = "records", Namespace = "urn:partner.soap.sforce.com")]
[XmlType(Namespace = "urn:sobject.partner.soap.sforce.com", TypeName = "sObject")]
public class SalesForceGetLeadResultRecord
{
    [XmlElement(ElementName = "FirstName", Namespace = "urn:sobject.partner.soap.sforce.com")]
    public string FirstName { get; set; }

    [XmlElement(ElementName = "LastName", Namespace = "urn:sobject.partner.soap.sforce.com")]
    public string LastName { get; set; }

    [XmlElement(ElementName = "Email", Namespace = "urn:sobject.partner.soap.sforce.com")]
    public string Email { get; set; }

    [XmlElement(ElementName = "LP_CountryCode__c", Namespace = "urn:sobject.partner.soap.sforce.com")]
    public string CountryCode { get; set; }

    [XmlElement(ElementName="LP_QuoteInformation__r", Namespace="urn:sobject.partner.soap.sforce.com")]
    public SalesForceQuoteInformation QuoteInformation { get; set; }

}

[XmlRoot(ElementName="LP_QuoteInformation__r", Namespace = "urn:sobject.partner.soap.sforce.com")]
[XmlType(TypeName = "QueryResult", Namespace = "urn:sobject.partner.soap.sforce.com")]
public class SalesForceQuoteInformation
{

    [XmlElement(ElementName="done", Namespace="urn:partner2.soap.sforce.com")]
    public bool Done { get; set; }
}

The code to deserialize looks like this:

var serializer = new XmlSerializer(typeof(T));
var deserialized = (T)serializer.Deserialize(await result.Content.ReadAsStreamAsync());

I tried removing the XmlType, and changing the namespace. When I changed the namespace it didn't give me any error but the object was not deserialized.

0

There are 0 answers