Root-Element Fehlt beim Deserialisieren eines XML-Antwort mit XmlSerializer

Ich habe die folgende XML-Antwort, die ich bin versucht zu Deserialisieren mit XmlSerializer. Wenn ich entfernen Sie den call-to-XML-serializer ich werfe keine Fehler. Jedes mal, wenn ich XmlSerializer ich bekommen
eine Ausnahme. Was bin ich?

Ausnahme:

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>

Mein Aufruf ist XmlSerializer:

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 der Aufruf Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); bewirkt, dass der Strom verbraucht und nicht verfügbar für die Serialisierung. Entfernen Sie diese Zeile erlaubt, mich richtig zu serialisieren der XML-Datei in meine Klassen.

  • Versuchen Sie, die XmlRoot("NeweggAPIResponse") zu XmlType("NeweggAPIResponse").
  • Kann ich sehen, den code, wo Sie das abrufen der eigentlichen XML-bitte? Getestet hab ich deinen code lokal und es funktioniert, wenn ich das laden der XML-Datei von der Festplatte, aber mit der Einschränkung, dass Sie nicht brauchen, die intermediate ReportResponseList Klasse.
  • Hinzugefügt aufrufenden code. Siehe edit. Stephan: Das hat nicht funktioniert.
  • Sind Sie sicher, dass der XML-Code, wie Sie es erwarten? Die Chancen sind, dass das root-element eigentlich fehlt (d.h., das XML ist leer).
  • Jetzt haben Sie machte mich an zu zweifeln, lol. Lassen Sie mich überprüfen
  • Die Antwort korrekt ist, aber ich denke, das Problem könnte sein, in welcher Reihenfolge meine Antwort übergeben wird der serializer. Es wird übergeben, nachdem calling Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); was ich denke, vielleicht schließen des Streams, bevor es serialisiert werden kann. Können Sie bestätigen, wenn dies der Fall wäre?
  • Ja, das wäre auch der Fall ist. ReadToEnd liest zu Ende

InformationsquelleAutor Robert H | 2012-07-26
Schreibe einen Kommentar