Tengo la siguiente respuesta XML. Estoy tratando de deserializar usando XmlSerializer. Cuando elimino la llamada al serializador XML, no arrojo errores. Cada vez que uso XmlSerializer obtengo una excepción de . ¿Qué me estoy perdiendo?Root Element Falta al deserializar una respuesta XML usando XmlSerializer
Excepción es:
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()
en documento XML es:
<?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>
Mi llamado a XmlSerializer es:
XmlSerializer serializer = new XmlSerializer(typeof(SubmitReportResponse));
reportReq = serializer.Deserialize(respStream) as SubmitReportResponse;
clase SubmitReportResponse es:
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:
Código Solicitud:
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());
}
Resolución:
Parece que llamar Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd()));
hace que la corriente para ser consumido y no estará disponible para la serialización. Eliminar esta línea me permitió serializar correctamente el XML en mis clases.
Intente cambiar el XmlRoot ("NeweggAPIResponse") a XmlType ("NeweggAPIResponse"). – Stephan
¿Puedo ver el código donde recuperas el XML real, por favor? He probado tu código localmente y funciona si cargo el archivo XML desde el disco, pero con la advertencia de que no necesitas la clase intermedia ReportResponseList. – dash
@dash Código de llamada agregado. Por favor, mira editar. Stephan: Eso no funcionó. –