C# 使用XmlSerializer反序列化XML响应时缺少根元素

C# 使用XmlSerializer反序列化XML响应时缺少根元素,c#,xml-serialization,C#,Xml Serialization,我尝试使用XmlSerializer反序列化以下XML响应。当我删除对XML序列化程序的调用时,不会抛出任何错误。每次使用XmlSerializer,我都会 例外。我错过了什么 例外情况是: System.Xml.XmlException: Root element is missing. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.ParseDocumentCont

我尝试使用XmlSerializer反序列化以下XML响应。当我删除对XML序列化程序的调用时,不会抛出任何错误。每次使用XmlSerializer,我都会 例外。我错过了什么

例外情况是:

System.Xml.XmlException: Root element is missing.
  at System.Xml.XmlTextReaderImpl.Throw(Exception e)
  at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
  at System.Xml.XmlTextReaderImpl.Read()
  at System.Xml.XmlTextReader.Read()
  at System.Xml.XmlReader.MoveToContent()
  at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderSubmitReportResponse.Read5_NeweggAPIResponse()
Xml文档是:

<?xml version="1.0" encoding="utf-8"?>
<NeweggAPIResponse>
    <IsSuccess>true</IsSuccess>
    <OperationType>OrderListReportResponse</OperationType>
    <SellerID>myID</SellerID>
    <ResponseBody>
        <ResponseList>
            <ResponseInfo>
                <RequestId>XXXXXXXX</RequestId>
                <RequestType>ORDER_LIST_REPORT</RequestType>
                <RequestDate>07/26/2012 09:27:06</RequestDate>
                <RequestStatus>SUBMITTED</RequestStatus>
            </ResponseInfo>
        </ResponseList>
    </ResponseBody>
</NeweggAPIResponse>
SubmitReportResponse类是:

    public enum RequestStatus
{
    ALL,
    SUBMITTED,
    IN_PROGRESS,
    FINISHED,
    CANCELLED
}

/// <summary>
/// TODO: Update summary.
/// </summary>
[XmlRoot("NeweggAPIResponse")]
public class SubmitReportResponse
{
    public string IsSuccess { get; set; }
    public string OperationType { get; set; }
    public string SellerID { get; set; }
    public ReportResponseBody ResponseBody { get; set; }

    public SubmitReportResponse()
    {
        ResponseBody = new ReportResponseBody();
    }
}

public class ReportResponseBody
{
    public string Memo { get; set; }
    public ReportResponseList[] ResponseList { get; set; }   



    public ReportResponseBody()
    {

        ResponseList = new ReportResponseList[0];
    }
}

public class ReportResponseList
{
    public ResponseInfo[] ResponseInfo { get; set; }

    public ReportResponseList()
    {
        ResponseInfo = new ResponseInfo[0];
    }

}

public class ResponseInfo
{
    public string RequestId { get; set; }
    public string RequestType { get; set; }
    public string RequestDate { get; set; }
    public RequestStatus RequestStatus { get; set; }

    public ResponseInfo()
    {
        RequestStatus = new RequestStatus();
    }
}
决议:


似乎调用
Console.WriteLine(String.Format(“{0}”),readerOK.ReadToEnd())导致流被使用并且无法用于序列化。删除这一行使我能够正确地将XML序列化到我的类中

调用
Console.WriteLine(String.Format(“{0}”,readerOK.ReadToEnd())导致流被使用并且无法用于序列化


删除这一行使我能够正确地将XML序列化到我的类中。

尝试将XmlRoot(“NeweggAPIResponse”)更改为XmlType(“NeweggAPIResponse”)。我可以看看检索实际XML的代码吗?我已经在本地测试了您的代码,如果我从磁盘加载XML文件,它就可以工作,但需要注意的是,您不需要中间的ReportResponseList类。@dash添加了调用代码。请参见编辑。史蒂芬:那没用。你确定XML和你期望的一样吗?很可能根元素实际上丢失了(即XML是空的)。@JohnSaunders现在你让我怀疑自己lol。让我检查一下你是否可以设置Stream.Position=0
    public enum RequestStatus
{
    ALL,
    SUBMITTED,
    IN_PROGRESS,
    FINISHED,
    CANCELLED
}

/// <summary>
/// TODO: Update summary.
/// </summary>
[XmlRoot("NeweggAPIResponse")]
public class SubmitReportResponse
{
    public string IsSuccess { get; set; }
    public string OperationType { get; set; }
    public string SellerID { get; set; }
    public ReportResponseBody ResponseBody { get; set; }

    public SubmitReportResponse()
    {
        ResponseBody = new ReportResponseBody();
    }
}

public class ReportResponseBody
{
    public string Memo { get; set; }
    public ReportResponseList[] ResponseList { get; set; }   



    public ReportResponseBody()
    {

        ResponseList = new ReportResponseList[0];
    }
}

public class ReportResponseList
{
    public ResponseInfo[] ResponseInfo { get; set; }

    public ReportResponseList()
    {
        ResponseInfo = new ResponseInfo[0];
    }

}

public class ResponseInfo
{
    public string RequestId { get; set; }
    public string RequestType { get; set; }
    public string RequestDate { get; set; }
    public RequestStatus RequestStatus { get; set; }

    public ResponseInfo()
    {
        RequestStatus = new RequestStatus();
    }
}
            HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
            request.Proxy = null;
            request.Method = "POST";
            //Specify the xml/Json content types that are acceptable. 
            request.ContentType = "application/xml";
            request.Accept = "application/xml";

            //Attach authorization information
            request.Headers.Add("Authorization", apikey);
            request.Headers.Add("Secretkey", secretkey);

            GetOrderListRequest requestObj = new GetOrderListRequest();
            requestObj.OperationType = OperationType.OrderListReportRequest;
            requestObj.RequestBody = new OrderListRequestBody();
            requestObj.RequestBody.OrderReportCriteria = new OrderReportCriteria();
            requestObj.RequestBody.OrderReportCriteria.Status = 3;
            requestObj.RequestBody.OrderReportCriteria.KeywordsType = 0;
            requestObj.RequestBody.OrderReportCriteria.OrderDateFrom = "2012-01-01";
            requestObj.RequestBody.OrderReportCriteria.OrderDateTo = "2012-07-26";
            requestObj.RequestBody.OrderReportCriteria.OrderDownloaded = "false";

            string requestBody = SerializeToString(requestObj);

            byte[] byteStr = Encoding.UTF8.GetBytes(requestBody);
            request.ContentLength = byteStr.Length;

            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(byteStr, 0, byteStr.Length);
            }

            //Parse the response
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                //Business error
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    Console.WriteLine(string.Format("Error: response status code is{0}, at time:{1}", response.StatusCode, DateTime.Now.ToString()));

                    return;
                }
                else if (response.StatusCode == HttpStatusCode.OK)//Success
                {
                    using (Stream respStream = response.GetResponseStream())
                    {
                        StreamReader readerOK = new StreamReader(respStream);
                        //Console.WriteLine(String.Format("Result:{0}", DateTime.Now.ToString()));
                        Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd()));

                        XmlSerializer serializer = new XmlSerializer(typeof(SubmitReportResponse));
                        reportReq = serializer.Deserialize(respStream) as SubmitReportResponse;
                    }
                }
            }


    public string SerializeToObj(object obj)
    {

        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        settings.Encoding = new UTF8Encoding(false);
        settings.Indent = true;
        XmlSerializer xs = new XmlSerializer(obj.GetType());
        MemoryStream ms = new MemoryStream();

        // xs.Serialize(ms, obj,ns);


        XmlWriter writer = XmlWriter.Create(ms, settings);
        xs.Serialize(writer, obj, ns);

        return Encoding.UTF8.GetString(ms.ToArray());
    }