There is an error in XML document (1,2) , System.InvalidOperationException: <AuthorizationResult xlms:""> was not expected

68,996

It appears to be complaining about an unexpected root element and there is some confusion surrounding that elsewhere in your question.

In the question title you have <AuthorizationResult>

In the example XML response you have <AuthenticationResult>

In the C# you have [XmlRoot(ElementName="AuthorizationResult")]

At the end of your question you mention <AuthorizationData>

That's quite a few subtle variations on a theme.

Assuming the XML sample response is correct, you should change the C# to expect the root element to be <AuthenticationResult>...

[XmlRoot(ElementName="AuthenticationResult")]
public class AuthenticationResult
{
    ...
Share:
68,996
hfrog713
Author by

hfrog713

I am originally from New Rochelle, NY. I currently live in Syracuse, NY. I am currently working in Quality Assurance. I like play golf, basketball, and soccer.

Updated on May 27, 2020

Comments

  • hfrog713
    hfrog713 almost 4 years

    XML sent from API

    <AuthenticationResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <PAPIErrorCode>0</PAPIErrorCode>
    <ErrorMessage/>
    <AccessToken>StringAccessToken</AccessToken>
    <AccessSecret>StringAccessToken</AccessSecret>
    <PolarisUserID>PolarisSampleUser</PolarisUserID>
    <BranchID>7</BranchID>
    <AuthExpDate>2013-05-27T16:57:46.323</AuthExpDate>
    </AuthenticationResult>
    

    Classes for Response

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    using System.Xml.Schema;
    using System.Xml.Serialization;
    
    namespace PAPIAutomatedTestingTool
    {
        [XmlRoot(ElementName="AuthorizationResult")]
        public class AuthorizationResult
        {
            public int PAPIErrorCode { get; set; }
    
            public string ErrorMessage { get; set; }
    
            public string AccessToken { get; set; }
    
            public string AccessSecret { get; set; }
    
            public int PolarisUserID { get; set; }
    
            public int BranchID { get; set; }
    
            public DateTime AuthExpDate { get; set; }
        }
    }
    

    Code making request and deserializing

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Net;
    using System.Web;
    using System.Web.Script.Serialization;
    using System.Security.Cryptography;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace PAPIAutomatedTestingTool
    {
        public class APICallMethods
        {
            public string URI { get; set; }
            public string accSecret { get; set; }
            public string accToken { get; set; }
            public string authorizationString { get; set; }
    
            public bool AuthenticateStaffUser()
            {
                try
                {
    
                //Initializing all variables
                string authReqMethod = "POST";
                string authAccessKey = "Sample Access Key";
                string authAccessKeyID = "Sample Access ID";
                string authPatronPassword = "";
                DateTime authDateTime = DateTime.Now;
                string httpAuthDateTime = authDateTime.ToUniversalTime().ToString("r");
                string authURI = "Sample URI";
    
    
                //Composing the papiHash from the given parameters
                string papiHash = GetPAPIHash(authAccessKey, authReqMethod, authURI, httpAuthDateTime, authPatronPassword);
                //Formating the authorization string 
                string authorizationString = String.Format("Authorization: PWS {0}:{1}", authAccessKeyID, papiHash);
    
    
                //Creating and defining the WebRequest
                WebRequest req = WebRequest.Create(authURI);
                req.Method = "POST";
                req.Headers.Add("PolarisDate", httpAuthDateTime);
                req.Headers.Add(authorizationString);
                req.ContentType = "application/xml";
                string requestBody = "<AuthenticationData><Domain>SampleDomain</Domain><Username>SampleUsername</Username><Password>SamplePassword</Password></AuthenticationData>";
                byte[] reqBodyBytes = System.Text.Encoding.UTF8.GetBytes(requestBody);
                req.ContentLength = reqBodyBytes.Length;
                using (Stream requestStream = req.GetRequestStream())
                {
                    requestStream.Write(reqBodyBytes, 0, reqBodyBytes.Length);
                }
    
    
                //Receiving the WebResponse
                using (WebResponse resp = req.GetResponse())
                {
                    AuthorizationResult firstResponse = new AuthorizationResult();
                    Stream respStream = resp.GetResponseStream();
                    StreamReader sr = new StreamReader(respStream);
    
    
                    XmlSerializer xmlSerializer = new XmlSerializer(typeof(AuthorizationResult));
                    firstResponse = (AuthorizationResult)xmlSerializer.Deserialize(respStream);
                    Console.WriteLine("Authorization: PWS" + firstResponse.AccessSecret + ":" + firstResponse.AccessToken);
                    return true;
                }
            }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    return false;
                }
    
            }
    
    
            public string GetPAPIHash(string strAccessKey, string strHTTPMethod, string strURI, string strHTTPDate, string strPatronPassword)
            {
                byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(strAccessKey);
                HMACSHA1 hmac = new HMACSHA1(secretBytes);
    
                byte[] dataBytes = null;
    
                if (strPatronPassword.Length > 0)
                {
                    dataBytes = UTF8Encoding.UTF8.GetBytes(strHTTPMethod + strURI + strHTTPDate + strPatronPassword);
                }
                else
                {
                    dataBytes = UTF8Encoding.UTF8.GetBytes(strHTTPMethod + strURI + strHTTPDate);
                }
                byte[] computedHash = hmac.ComputeHash(dataBytes);
                string computedHashString = Convert.ToBase64String(computedHash);
    
                return computedHashString;
            }
        }
    }
    

    I am making a POST request to the API with a body that contains AuthorizationData. The API is supposed to return the xml to deserialize into firstresponse. I have received the xml(confirmed by printing to console) but i am receiving the There is an error in the XML Document(1,2) and <AuthorizationData xmlns=""> was not expected. Thanks for the help in advance.

  • inthevortex
    inthevortex over 6 years
    I have been facing the same issue, same error. My XmlRoot is correctly named and still it gets stuck and says it cant identify xmlns="..." part. Can anyone help?
  • inthevortex
    inthevortex over 6 years
    the exact same error message was coming, I have solved it by adding attribute that defines its namespace and its working now. Thanks