XML 序列化 C#:XML 文档 (6、4) 中存在错误
XML Serialization C#: There is an error in XML document (6, 4)
我尝试将 XML 文件发送到服务。我使用以下方法发送它;
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("<", "<").Replace(">", ">").Replace(""", "\"");
#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
}
}
在此之前,我创建了一个对象,当我调用 AdonisRequestResponseMethod
时用作 prm_Criteria
。这就是我创建它的方式;
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>
是AdonisRequestResponseMethod中的XmlString变量中的数据。在执行过程中,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 显然应该是搜索方法的填充结果。
您在 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);
}
您的序列化 class 应该如下所示
[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; }
}
我尝试将 XML 文件发送到服务。我使用以下方法发送它;
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("<", "<").Replace(">", ">").Replace(""", "\"");
#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
}
}
在此之前,我创建了一个对象,当我调用 AdonisRequestResponseMethod
时用作 prm_Criteria
。这就是我创建它的方式;
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>
是AdonisRequestResponseMethod中的XmlString变量中的数据。在执行过程中,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 显然应该是搜索方法的填充结果。
您在 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);
}
您的序列化 class 应该如下所示
[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; }
}