2012-07-26 15 views
7

का उपयोग करते हुए एक XML प्रतिक्रिया को deserializing जब रूट तत्व गुम हो रहा है मेरे पास निम्न XML प्रतिक्रिया है I XmlSerializer का उपयोग करके deserialize करने की कोशिश कर रहा हूँ। जब मैं एक्सएमएल सीरियलाइज़र को कॉल हटा देता हूं तो मैंने कोई त्रुटि नहीं फेंक दी। हर बार जब मैं XmlSerializer का उपयोग करता हूं तो मुझे एक अपवाद मिलता है। मैं क्या खो रहा हूँ?XmlSerializer

अपवाद है:

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 डॉक्टर है:

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

XmlSerializer मेरे कॉल है:

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

SubmitReportResponse वर्ग है:

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

संपादित करें:

का निवेदन कोड:

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

समाधान:

ऐसा लगता है कि फोन करने Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); धारा का सेवन किया और क्रमबद्धता के लिए अनुपलब्ध हो जा करने के लिए कारण बनता है। इस लाइन को हटाने से मुझे एक्सएमएल को मेरी कक्षाओं में व्यवस्थित रूप से क्रमबद्ध करने की अनुमति मिली।

+0

XmlRoot ("Neweggapiresponse") को XmlType ("Neweggapiresponse") में बदलने का प्रयास करें। – Stephan

+0

क्या मैं कोड देख सकता हूं जहां आप वास्तविक एक्सएमएल पुनर्प्राप्त करते हैं? मैंने स्थानीय रूप से आपके कोड का परीक्षण किया है और यह काम करता है अगर मैं डिस्क से एक्सएमएल फ़ाइल लोड करता हूं, लेकिन चेतावनी के साथ कि आपको इंटरमीडिएट रिपोर्ट रेस्पॉन्सलिस्ट क्लास की आवश्यकता नहीं है। – dash

+0

@ डैश जोड़ा गया कोड कोड। कृपया संपादन देखें। स्टीफन: यह काम नहीं किया। –

उत्तर

10

कॉलिंग Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd())); धारा का उपभोग करने का कारण बनता है और क्रमबद्धता के लिए अनुपलब्ध होता है।

इस लाइन को हटाने से मुझे एक्सएमएल को मेरी कक्षाओं में उचित रूप से क्रमबद्ध करने की अनुमति मिली।

+3

पर पढ़ता है आप Stream.Position = 0 सेट कर सकते हैं – Brij