2012-07-26 82 views
7

我有以下XML响应我想使用XmlSerializer进行反序列化。当我删除对XML序列化程序的调用时,我没有发现任何错误。每次我使用XmlSerializer时,我都会遇到 异常。我错过了什么?使用XmlSerializer反序列化XML响应时缺失根元素

的例外是:

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> 

我对XmlSerializer的电话是:

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

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

编辑:

请求代码:

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

分辨率:

看来,呼吁Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd()));导致被消耗,并进行序列化不可用的流。删除这一行允许我正确地将XML序列化到我的类中。

+0

尝试将XmlRoot(“NeweggAPIResponse”)更改为XmlType(“NeweggAPIResponse”)。 – Stephan 2012-07-26 17:09:57

+0

我可以在哪里找到您检索实际XML的代码吗?我已经在本地测试了您的代码,并且它在我从磁盘加载XML文件时起作用,但需要注意的是您不需要中间ReportResponseList类。 – dash 2012-07-26 17:19:09

+0

@dash添加了调用代码。请参阅编辑。斯蒂芬:那没用。 – 2012-07-26 17:56:31

回答

10

调用Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd()));会导致流被消耗并且不可用于序列化。

删除此行允许我正确地将XML序列化到我的类中。

+3

您可以设置Stream.Position = 0 – Brij 2013-06-25 13:48:59