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

2

17

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.

Talley answered 26/5, 2013 at 21:29 Comment(0)
D
24

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
{
    ...
Debag answered 27/5, 2013 at 0:21 Comment(2)
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?Sandusky
the exact same error message was coming, I have solved it by adding attribute that defines its namespace and its working now. ThanksSandusky
C
1

If you want to write a single deserialize for both schema and non-schema custom XMLs, you can turn off namespaces to avoid getting the 'There is an error in the XML Document(1,2)' error. But since the XmlReader expects a XML Schema, you should read it with StringReader class then use XmlReader object to remove custom namespaces.

//Namespaces
using System.IO;
using System.Xml.Serialization;

//Field
private static XmlSurrogates.Root _xmlSurrogates = new();

//Method
   private static void DeserializeXml(string xml)
        {
            try
            {
                XmlSerializer serializer = new XmlSerializer(_xmlSurrogates.GetType());
                using (StringReader reader = new StringReader(xml))
                {
                    var xmlTextReader = new System.Xml.XmlTextReader(reader);
                    xmlTextReader.Namespaces = false;
                    _xmlSurrogates = (XmlSurrogates.Root)(serializer.Deserialize(xmlTextReader));
                }
            }
            catch (Exception ex)
            {
                Log.Error($"There is an error while deserialize. Error: {ex.Message}");
            }
        }

//Root Model Example
public class XmlSurrogates
    {
        [XmlRoot(ElementName = "XMLROOTELEMENTNAMEHERE FOR THIS ITS root")]
        public class Root
        {
            [XmlElement(ElementName = "Boo")] public Boo Boo { get; set; }
            [XmlElement(ElementName = "Control")] public ClassName DeclareName { get; set; }
            [XmlAttribute(AttributeName = "MainCode")] public string MainCode { get; set; }
            [XmlAttribute(AttributeName = "Caption")] public string Caption { get; set; }
        }

        [XmlRoot(ElementName = "Boo")]
        public class ElementAsClassName
        {
            [XmlAttribute(AttributeName = "Foo")] public string PropertyName { get; set; }
        }
    }

Calla answered 22/12, 2022 at 6:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.