2012-07-26 18 views
7

Ho la seguente risposta XML che sto tentando di deserializzare utilizzando XmlSerializer. Quando rimuovo la chiamata al serializzatore XML non faccio errori. Ogni volta che uso XmlSerializer ottengo un'eccezione. Cosa mi manca?Elemento di radice Mancante quando deserializzare una risposta XML utilizzando XmlSerializer

eccezione è:

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> 

invito a far XmlSerializer è:

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

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

EDIT:

Codice Richiesta:

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

Risoluzione:

Sembra che chiamare Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); fa sì che il flusso per essere consumato e non essere disponibile per la serializzazione. La rimozione di questa riga mi ha permesso di serializzare correttamente l'XML nelle mie classi.

+0

Provare a modificare XmlRoot ("NeweggAPIResponse") in XmlType ("NeweggAPIResponse"). – Stephan

+0

Posso vedere il codice dove si recupera l'XML vero per favore? Ho testato il tuo codice localmente e funziona se carico il file XML dal disco, ma con l'avvertenza che non hai bisogno della classe intermedia di ReportResponseList. – dash

+0

@dash Aggiunto codice chiamante. Si prega di consultare modifica. Stephan: Non ha funzionato. –

risposta

10

Calling Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); fa sì che il flusso per essere consumato e non essere disponibile per la serializzazione.

La rimozione di questa riga mi ha permesso di serializzare correttamente l'XML nelle mie classi.

+3

Puoi impostare Stream.Position = 0 – Brij

Problemi correlati