2012-07-26 5 views
7

Ich habe die folgende XML-Antwort Ich versuche, mit XmlSerializer deserialize. Wenn ich den Aufruf des XML-Serialisierers lösche, erhalte ich keine Fehler. Jedes Mal, wenn ich XmlSerializer verwende, bekomme ich eine Ausnahme. Was vermisse ich?Root-Element fehlt beim Deserialisieren einer XML-Antwort mit XmlSerializer

Ausnahme ist:

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

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

zu XmlSerializer Mein Ruf ist:

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

SubmitReportResponse Klasse:

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:

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

Auflösung:

Es scheint, dass Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); bewirkt, dass der Strom Aufruf für die Serialisierung nicht verfügbar verbraucht werden und sein. Durch das Entfernen dieser Zeile konnte ich das XML ordnungsgemäß in meine Klassen serialisieren.

+0

Versuchen Sie, den XmlRoot ("NeweggAPIResponse") zu XmlType ("NeweggAPIResponse") zu ändern. – Stephan

+0

Kann ich den Code sehen, in dem Sie das aktuelle XML abrufen? Ich habe Ihren Code lokal getestet und es funktioniert, wenn ich die XML-Datei von der Festplatte lade, aber mit dem Vorbehalt, dass Sie die zwischenzeitliche ReportResponseList-Klasse nicht benötigen. – dash

+0

@dash Telefoncode hinzugefügt. Bitte siehe Bearbeiten. Stephan: Das hat nicht funktioniert. –

Antwort

10

Der Aufruf Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); bewirkt, dass der Stream verbraucht wird und für die Serialisierung nicht verfügbar ist.

Durch das Entfernen dieser Zeile konnte ich das XML ordnungsgemäß in meine Klassen serialisieren.

+3

Sie könnten Stream.Position = 0 festlegen – Brij

Verwandte Themen