views:

64

answers:

2

I'm having some issues deserializing an xml document. The document I am trying to deserialize is this:

<slt:CreateGiftRegistryResponse xmlns:slt="http://WWW.example.com/"&gt;
<slt:Response>
<slt:ResponseCode>ERROR</slt:ResponseCode>
<slt:ResponseDescription>Request unsuccessfull null</slt:ResponseDescription>
</slt:Response></slt:CreateGiftRegistryResponse>

My class looks like this:

/// <summary>
/// response to attempt to add items to a registry
/// </summary>
[XmlRoot("CreateGiftRegistryResponse")]
public class CreateRegistryResponse : ResponseBase
{
    // Constant Declarations

    // Variable Declarations

    #region --- Constructors ---

    public CreateRegistryResponse()
        : this(String.Empty) { }

    /// <summary>
    /// response to attempt to add items to a registry
    /// </summary>
    /// <param name="response">xml string</param>
    public CreateRegistryResponse(string responseXml)
    {
        try
        {
            Load(responseXml);
        }
        catch (Exception ex)
        {
            // Report the exception and throw to the caller for handling.
            ExceptionManager.Publish(ex,
                "ctor CreateRegistryResponse() failed.",
                Severity.Fatal);
            throw;
        }
    }
    #endregion

    #region --- Properties ---
    /// <summary>
    /// structure for the typical response - code and description
    /// </summary>
    [XmlElement("Response")]
    public ResponseWS Response { get; set; }


    #endregion

    #region --- Static Methods ---
    #endregion

    #region --- CRUD ---
    #endregion

    #region --- Validation ---
    #endregion

    #region --- Business Methods ---
    /// <summary>
    /// Load the web service result string into a Result.
    /// </summary>
    public void Load(string response)
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(CreateRegistryResponse), this.GetExtraTypes());
            byte[] byteArray = Encoding.ASCII.GetBytes(response);
            MemoryStream stream = new MemoryStream(byteArray);

            // convert the results into a usable format
            CreateRegistryResponse formattedResponse = serializer.Deserialize(stream) as CreateRegistryResponse;

            this.Response = formattedResponse.Response;
            if (formattedResponse.Response.ResponseCode == ResponseCode.SUCCESS.ToString())
            {
                this.IsSuccessful = true;
            }


        }
        catch (Exception ex)
        {
            // Report the exception and throw to the caller for handling.
            ExceptionManager.Publish(ex,
                "Load() failed. Unable to authenticate user.",
                Severity.Fatal);
            throw;
        }
        finally
        {
            //
            // TODO: Add clean-up code here, if needed.
            //
        }
    }

    /// <summary>
    /// Get an array of types that are possibly contained within this class
    /// </summary>
    public Type[] GetExtraTypes()
    {
        try
        {
            //
            // TODO: Add code here.
            //
            // build an array of possible types within this type.
            List<Type> types = new List<Type>();
            types.Add(typeof(ResponseWS));


            return types.ToArray();


        }
        catch (Exception ex)
        {
            // Report the exception and throw to the caller for handling.
            ExceptionManager.Publish(ex,
                "GetExtraTypes() failed. Unable to return list",
                Severity.Fatal);
            throw;
        }
    }
    #endregion
}

When I use this code, I get this error: {" was not expected."}

If I change the XmlRoot element to also contain the Namespace, then my error changes to root element is missing.

I thought that one of these would give me the result I expected, but that's not the case. Can someone spot what I'm missing here?

+2  A: 

An approach I've used when trying to get my classes decorated correctly when deserializing is to use XSD.exe to generate c# classes based on the XSD, then compare the decoration to my own class. On more than one occasion it has shed light on issues.

Open a visual studio command prompt, then:

xsd /c <filename>.xsd
Ricky Smith
XSD.exe was actually the culprit! I used it based on a tutorial and didn't do enough reading up on it at first to understand it. The issue was definitely with my class decorators. I believe there were 2 root declarations. It's now working just fine.
mkeller
+1  A: 

Set the Namespace property of your XmlRoot attribute according to the namespace of the XML element.

Is it a fragment of the XML document or the complete one? I don't see the XML declaration

Johann Blais
Thank you! This was directly related to my issue. The code was split amongst several classes and this heirarchy and the way this xml response looks caused me quite a bit of confusion.
mkeller