XML文档中有错误(1,2),System.InvalidOperationException: <AuthorizationResult xlms:"">未被预期。

17

API发送的XML

<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>

响应类

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; }
    }
}

请求代码生成和反序列化

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;
        }
    }
}

我正在向API发出POST请求,请求体中包含AuthorizationData。API应该返回xml以反序列化为firstresponse。我已收到xml(通过打印到控制台确认),但我收到了错误信息XML Document(1,2)中存在错误<AuthorizationData xmlns="">不是预期的内容。提前感谢您的帮助。

2个回答

24

它似乎在抱怨一个意外的根元素,并且在你的问题中其他地方也存在一些混淆。

在问题标题中,你有 <AuthorizationResult>

在示例 XML 响应中,你有 <AuthenticationResult>

在 C# 中,你有 [XmlRoot(ElementName="AuthorizationResult")]

在问题结尾处提到了<AuthorizationData>

这是主题的许多微妙变化。

假设 XML 示例响应是正确的,则应将 C# 更改为期望根元素为<AuthenticationResult>...

[XmlRoot(ElementName="AuthenticationResult")]
public class AuthenticationResult
{
    ...

1
我一直面临着相同的问题,相同的错误。我的XmlRoot已经正确命名,但它仍然卡住并说无法识别xmlns="..."部分。有人能帮忙吗? - inthevortex
3
出现了完全相同的错误信息,我通过添加定义其命名空间的属性来解决了它,现在它可以正常工作了。谢谢。 - inthevortex

1
如果您想为模式和非模式自定义XML编写单个反序列化程序,可以关闭命名空间以避免出现“XML文档(1,2)中存在错误”的错误。但是由于XmlReader期望一个XML Schema,因此您应该使用StringReader类读取它,然后使用XmlReader对象删除自定义命名空间。
//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; }
        }
    }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接