Root Element None when deserializing an XML response using XmlSerializer

I have the following XML answer that I am trying to deserialize using XmlSerializer. When I delete the call to the XML serializer, I make no mistakes. Every time I use XmlSerializer, I get an exception. What am I missing?

An exception:

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

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

My XmlSerializer call:

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

SubmitReportResponse Class:

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

EDIT:

Request code:

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

Resolution:

It seems like calling Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); causes the stream to be consumed and not available for serialization. Removing this line allowed me to correctly serialize the XML into my classes.

+7
source share
1 answer

Call Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); causes the stream to be consumed and not available for serialization.

Removing this line allowed me to correctly serialize the XML into my classes.

+10
source

All Articles