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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufrufen
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.