Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML序列化C#:XML文档中有一个错误(6,4)_C#_Xml_Xml Serialization - Fatal编程技术网

XML序列化C#:XML文档中有一个错误(6,4)

XML序列化C#:XML文档中有一个错误(6,4),c#,xml,xml-serialization,C#,Xml,Xml Serialization,我尝试向服务发送一个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 { /// <summa

我尝试向服务发送一个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("&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
    }
}
这是我的
adonishotelsercharchriteriadto
对象

 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>

20151020
20151021
28674
161
TR
- 
1.
2000
- 
- 
2.
1.
0
- 
---- 
--- 
---- 
它是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>

错误类型:未确定代码:1000方法名称:ConvertXmlToType错误消息:XML文档中存在错误(6,4)。
在调试结束时,我会遇到一些例外情况,如:;InvalidOperationException和MissingMethodException


我想要的不是那样的。我希望AdonishotelSearchResultTo显然应该是搜索方法的结果。

您在
转换XMLTOTYPE
中使用
内存流
流编写器
流阅读器
做了很多非常奇怪的事情

我还没有花时间完全理解它,但这里的某些东西意味着序列化程序可能没有阅读您认为的内容。我猜调用
StreamReader.ReadLine()
意味着序列化程序在错误的位置启动

为什么不使用更直接的方法呢?对于您的XML,这对我很有用:

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

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

序列化的类应该如下所示

[XmlRoot(“AdonisHotelSearchCriteriaDTO”)]
公共类AdonisHotelSearchCriteriaDTO
{
公共字符串CheckInDate{get;set;}
公共字符串签出日期{get;set;}
公共字符串CityID{get;set;}
公共字符串CountryID{get;set;}
公共字符串HotelID{get;set;}
公共字符串国有代码{get;set;}
公共分页数据分页数据{get;set;}
公共RoomCriteria RoomCriteria{get;set;}
公共凭据凭据{get;set;}
}
[XmlRoot(“分页数据”)]
公共类分页数据
{
公共整数页码{get;set;}
public int ItemsPerPage{get;set;}
}
[XmlRoot(“RoomCriteria”)]
公共教室标准
{
RoomCriteriaDTO RoomCriteriaDTO{get;set;}
}
[XmlRoot(“RoomCriteriaDTO”)]
公共教室标准
{
public int AdultCount{get;set;}
public int RoomCount{get;set;}
public int ChildCount{get;set;}
}
[XmlRoot(“凭据”)]
公共类凭据
{
public int clientID{get;set;}
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
}
我知道这有点复杂(可能不止一点)。无论如何,我会试试你的建议,谢谢。
var serializer = new XmlSerializer(typeof (T));

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