L'Élément racine Manquante lors de la désérialisation XML à l'aide de XmlSerializer

J'ai le code XML suivant la réponse, je suis en train de désérialiser l'aide de XmlSerializer. Quand j'ai supprimer l'appel à XML sérialiseur je jette pas d'erreurs. Chaque fois que j'utilise XmlSerializer-je obtenir
une exception. Ce qui me manque?

Exception est la suivante:

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

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

Mon appel à XmlSerializer:

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

SubmitReportResponse classe est:

    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:

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

Résolution:

Il semble que l'appel à Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); provoque le flux de consommer et d'être indisponible pour la sérialisation. La suppression de cette ligne m'a permis de bien sérialiser les données XML dans mes classes.

Essayez de changer la XmlRoot("NeweggAPIResponse") à XmlType("NeweggAPIResponse").
Puis-je voir le code où vous récupérez le code XML s'il vous plaît? J'ai testé ton code en local et cela fonctionne si je charge le fichier XML à partir du disque, mais avec la réserve que vous n'avez pas besoin de l'intermédiaire ReportResponseList classe.
Ajouté le code appelant. Veuillez voir modifier. Stephan: cela ne fonctionne pas.
Êtes-vous certain que le XML est que vous attendez? Les Chances sont que l'élément racine est réellement manquantes (c'est à dire, le XML est vide).
Maintenant, tu m'as fait douter de moi-même lol. Laissez-moi vérifier

OriginalL'auteur Robert H | 2012-07-26

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *