2015-04-27 2 views
-1

Я пытаюсь отправить XML-файл в службу. Я использую следующий метод для его отправки;XML Serialization C#: В документе XML есть ошибка (6, 4)

using System; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.IO.Compression; 
using System.Xml.Serialization; 

namespace Sample 
{ 
    public class SampleHttpResquestAndResponse 
    { 
     /// <summary> 
     /// Adonis servisi ile iletişim kurmayı sağlar. 
     /// </summary> 
     /// <typeparam name="T">T</typeparam> 
     /// <param name="prm_ServiceName">string</param> SearchHotels // BasketHotels // ConfirmHotels 
     /// <param name="prm_Criteria">object</param> 
     /// <param name="prm_Url">string</param> "http://xmltest.adonis.com/AdonisServices" 
     /// <returns>T</returns> 
     public static T AdonisRequestResponseMethod<T>(string prm_ServiceName, object prm_Criteria, string prm_Url) 
     { 
      #region Variables 
      HttpWebRequest HttpWebRequest; 
      T ReturnValue; 
      #endregion 

      try 
      { 
       #region Xml Serializer 
       var XmlString = SampleHttpResquestAndResponse.ConvertTypeToXml<object>(prm_Criteria).ToString(); 
       #endregion 

       #region Http Web Request 
       HttpWebRequest = (HttpWebRequest)WebRequest.Create(string.Format("{0}/{1}?prm_CurrentData={2}", prm_Url, prm_ServiceName, XmlString)); 
       HttpWebRequest.ContentType = "text/xml;charset=\"utf-8\""; 
       HttpWebRequest.Method = "POST"; 
       HttpWebRequest.Timeout = 80000000; 
       #endregion 

       #region Http Web Response 
       StreamWriter StreamWriterPost = new StreamWriter(HttpWebRequest.GetRequestStream()); 
       StreamWriterPost.Write(XmlString); 

       StreamWriterPost.Close(); 
       HttpWebResponse HttpWebResponse = (HttpWebResponse)HttpWebRequest.GetResponse(); 
       StreamReader StreamReaderResponse = new StreamReader(HttpWebResponse.GetResponseStream(), Encoding.UTF8); 
       string StringResponse = string.Empty; 

       if (HttpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
       { 
        using (GZipStream decompress = new GZipStream(HttpWebResponse.GetResponseStream(), CompressionMode.Decompress)) 
        { 
         StreamReader reader = new StreamReader(decompress); 
         StringResponse = reader.ReadToEnd(); 
        } 
       } 
       else 
       { 
        StreamReader reader = new StreamReader(HttpWebResponse.GetResponseStream(), Encoding.UTF8); 
        StringResponse = reader.ReadToEnd(); 
       } 
       #endregion 

       #region Return Value Type Process (DESERIALIZE) 
       ReturnValue = SampleHttpResquestAndResponse.ConvertXmlToType<T>(StringResponse.ToString()).Data; 
       #endregion 

       #region Return Value 
       return ReturnValue; 
       #endregion 
      } 
      catch (Exception ex) 
      { 
       #region Return Value 
       return ReturnValue = SampleHttpResquestAndResponse.ConvertXmlToType<T>(ex.Message).Data; 
       #endregion 
      } 
     } 

     public static ResultDTO<T> ConvertXmlToType<T>(string prm_Xml) 
     { 
      #region Variables 
      T ReturnValue; 
      #endregion 

      try 
      { 
       #region Replace String Value 
       prm_Xml = prm_Xml.Replace("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" 
             , "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); 
       prm_Xml = prm_Xml.Replace("&lt;", "<").Replace("&gt;", ">").Replace("&quot;", "\""); 
       #endregion 

       #region Deserialize 
       using (MemoryStream MemoryStream = new MemoryStream()) 
       { 
        using (StreamWriter StreamWriter = new StreamWriter(MemoryStream)) 
        { 
         StreamWriter.Write(prm_Xml); 
         StreamWriter.Flush(); 
         MemoryStream.Position = 0; 
         XmlSerializer XmlSerializer = new XmlSerializer(typeof(T)); 
         using (StreamReader StreamReader = new StreamReader(MemoryStream)) 
         { 
          StreamReader.ReadLine(); 
          #region Result Value (SET) 
          ReturnValue = (T)XmlSerializer.Deserialize(StreamReader); 
          #endregion 
         } 
        } 
       } 
       #endregion 

       #region Return Value 
       return new ResultDTO<T> 
       { 
        Data = ReturnValue, 
        Success = true 
       }; 
       #endregion 
      } 
      catch (Exception ex) 
      { 
       #region Return Value 
       return new ResultDTO<T> 
       { 
        Success = false, 
        Message = string.Format("Error Type : {0} Code : {1} Method Name : {2} Error Mesage : {3}", "Undetermined", "1000", "ConvertXmlToType", ex.Message), 
       }; 
       #endregion 
      } 
     } 

     public static string ConvertTypeToXml<T>(T prm_Criteria) 
     { 
      #region Variables 
      XmlSerializer XmlSerializer; 
      StringWriter StringWriter = new StringWriter(); 
      #endregion 

      try 
      { 
       #region Xml Serializer 
       XmlSerializer = new XmlSerializer(prm_Criteria.GetType()); 
       XmlSerializer.Serialize(StringWriter, prm_Criteria); 
       var XmlString = StringWriter.ToString(); 
       #endregion 

       #region Request Replace 
       return XmlString = XmlString.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", ""); 
       #endregion 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      finally 
      { 
       GC.SuppressFinalize(StringWriter); 
      } 

     } 
    } 

    public class ResultDTO 
    { 
     #region Properties 
     /// <summary> 
     /// İslem durumu. 
     /// </summary> 
     public bool Success { get; set; } 
     /// <summary> 
     /// İşlem mesajı. 
     /// </summary> 
     public string Message { get; set; } 
     #endregion 
    } 

    public class ResultDTO<T> : ResultDTO 
    { 
     #region Fields 
     /// <summary> 
     /// Generic data tipi. 
     /// </summary> 
     private T data = Activator.CreateInstance<T>(); 
     #endregion 

     #region Properties 
     /// <summary> 
     /// Generic data tipi 
     /// </summary> 
     public T Data 
     { 
      get 
      { 
       if (data == null) 
        return data = default(T); 
       return data; 
      } 
      set { data = value; } 
     } 
     #endregion 
    } 
} 

До этого я создаю объект, который используется в качестве prm_Criteria, когда я звоню AdonisRequestResponseMethod. Вот как я его создаю;

public string searchByCity(string cityID) 
     { 

      AdonisHotelSearchCriteriaDTO searchObj = new AdonisHotelSearchCriteriaDTO(); 
      searchObj.CheckInDate = "20151020"; 
      searchObj.CheckOutDate = "20151021"; 
      searchObj.CityID = cityID; 
      searchObj.CountryID = "161"; 
      searchObj.NationalityCode = "TR"; 

      searchObj.PaginationData = new PaginationData(); 
      searchObj.PaginationData.ItemsPerPage = "2000"; 
      searchObj.PaginationData.PageNumber = "1"; 
      RoomCriteria rcriteria = new RoomCriteria(); 
      rcriteria.RoomCriteriaDTO = new RoomCriteriaDTO(); 
      rcriteria.RoomCriteriaDTO.AdultCount = "2"; 
      rcriteria.RoomCriteriaDTO.ChildCount = "0"; 
      rcriteria.RoomCriteriaDTO.RoomCount = "1"; 

      searchObj.RoomCriteria = rcriteria; 
      searchObj.Credentials = login(); 

      string param1 = "SearchHotels"; 
      object param2 = searchObj; 
      string param3 = "http://xmltest.adonis.com/AdonisServices"; 

      string res = SampleHttpResquestAndResponse.AdonisRequestResponseMethod<string>(param1, param2, param3); 

      return res; 


     } 

И это мой AdonisHotelSearchCriteriaDTO объект;

public class AdonisHotelSearchCriteriaDTO 
    { 
     public string CheckInDate { get; set; } 
     public string CheckOutDate { get; set; } 
     public string CityID { get; set; } 
     public string CountryID { get; set; } 
     public string HotelID { get; set; } 
     public string NationalityCode { get; set; } 
     public PaginationData PaginationData { get; set; } 
     public RoomCriteria RoomCriteria { get; set; } 
     public Credentials Credentials { get; set; } 


    } 

XML создан в этом методе:

<AdonisHotelSearchCriteriaDTO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CheckInDate>20151020</CheckInDate> 
    <CheckOutDate>20151021</CheckOutDate> 
    <CityID>28674</CityID> 
    <CountryID>161</CountryID> 
    <NationalityCode>TR</NationalityCode> 
- <PaginationData> 
    <PageNumber>1</PageNumber> 
    <ItemsPerPage>2000</ItemsPerPage> 
    </PaginationData> 
- <RoomCriteria> 
- <RoomCriteriaDTO> 
    <AdultCount>2</AdultCount> 
    <RoomCount>1</RoomCount> 
    <ChildCount>0</ChildCount> 
    </RoomCriteriaDTO> 
    </RoomCriteria> 
- <Credentials> 
    <clientID>----</clientID> 
    <username>---</username> 
    <password>----</password> 
    </Credentials> 
    </AdonisHotelSearchCriteriaDTO> 

Это данные в XmlString переменной в AdonisRequestResponseMethod. Во время выполнения переменная StringResponse получает это значение, чего не ожидается;

<AdonisHotelSearchResultDTO xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Errors> 
    <ErrorMessage>Error Type : Undetermined Code : 1000 Method Name : ConvertXmlToType Error Mesage : There is an error in XML document (6, 4).</ErrorMessage> 
    </Errors> 
    <AvailableHotel /> 
</AdonisHotelSearchResultDTO> 

В конце отладки я сталкиваюсь с некоторыми исключениями; InvalidOperationException и MissingMethodException.

Что я хочу, это не так. Я ожидаю, что AdonisHotelSearchResultDTO должен заполнить результаты поискового метода.

ответ

0

Вы делаете очень странные вещи в ConvertXmlToType с MemoryStream, StreamWriter, StreamReader.

Я не нашел времени, чтобы его полностью понять, но что-то здесь означает, что сериализатор, вероятно, не читает, что вы думаете. Я предполагаю, что вызов StreamReader.ReadLine() означает, что сериализатор запускается не в том месте.

Почему бы не использовать что-то более прямолинейное? С вашей XML, это работает для меня:

var serializer = new XmlSerializer(typeof (T)); 

using (var reader = new StringReader(prm_Xml)) 
{ 
    ReturnValue = (T) serializer.Deserialize(reader); 
} 
+0

Я знаю, что это немного (может быть, больше, чем немного) сложно. Во всяком случае, я попробую ваше предложение, спасибо. –

0

Ваш сериализованная класс должен выглядеть следующим образом

[XmlRoot("AdonisHotelSearchCriteriaDTO")] 
 
    public class AdonisHotelSearchCriteriaDTO 
 
    { 
 
     public string CheckInDate { get; set; } 
 
     public string CheckOutDate { get; set; } 
 
     public string CityID { get; set; } 
 
     public string CountryID { get; set; } 
 
     public string HotelID { get; set; } 
 
     public string NationalityCode { get; set; } 
 
     public PaginationData PaginationData { get; set; } 
 
     public RoomCriteria RoomCriteria { get; set; } 
 
     public Credentials Credentials { get; set; } 
 
    } 
 
    [XmlRoot("PaginationData")] 
 
    public class PaginationData 
 
    { 
 
     public int PageNumber { get; set; } 
 
     public int ItemsPerPage { get; set; } 
 
    } 
 
    [XmlRoot("RoomCriteria")] 
 
    public class RoomCriteria 
 
    { 
 
     RoomCriteriaDTO RoomCriteriaDTO { get; set; } 
 
    } 
 
    [XmlRoot("RoomCriteriaDTO")] 
 
    public class RoomCriteriaDTO 
 
    { 
 
     public int AdultCount { get; set; } 
 
     public int RoomCount { get; set; } 
 
     public int ChildCount { get; set; } 
 
    } 
 
    [XmlRoot("Credentials")] 
 
    public class Credentials 
 
    { 
 
     public int clientID { get; set; } 
 
     public string username { get; set; } 
 
     public string password { get; set; } 
 
    }

Смежные вопросы