Я пытаюсь, безуспешно, десериализовать следующую строку XML, возвращенную из сторонней службы, в коллекцию объектов С#:
"<?xml version='1.0' encoding='ISO-8859-1'?><DataService><Request ID=\"2461627\" Status=\"Pending\"><TimeOffDate>2015-07-02</TimeOffDate><TimeStart></TimeStart><TimeEnd></TimeEnd><TimeOffHours>8.000</TimeOffHours><TimeOffTypeName>Holiday</TimeOffTypeName><LoginID>SPete</LoginID><Firstname>Stinky</Firstname><Lastname>Pete</Lastname><Comment><![CDATA[]]></Comment></Request><Request>...</Request></DataService>"
Вот определение моего класса:
[XmlRoot]
public sealed class DataServiceModel {
List<RequestModel> requests;
[XmlArray("DataService"), XmlArrayItem("Request", Type = typeof(RequestModel))]
public List<RequestModel> Requests { get { return requests ?? (requests = new List<RequestModel>()); } }
}
public class RequestModel {
[XmlAttribute("ID")]
public int Id { get; set; }
[XmlAttribute("Status")]
public string Status { get; set; }
[XmlElement("TimeOffDate")]
public DateTime RequestDate { get; set; }
[XmlElement("TimeStart")]
public DateTime Start { get; set; }
[XmlElement("TimeEnd")]
public DateTime End { get; set; }
[XmlElement("TimeOffHours")]
public decimal Hours { get; set; }
[XmlElement("TimeOffTypeName")]
public string TimeOffType { get; set; }
[XmlElement("FirstName")]
public string FirstName { get; set; }
[XmlElement("LastName")]
public string LastName { get; set; }
[XmlElement("LoginID")]
public string LoginId { get; set; }
}
И код, который я использую для десериализации того, что возвращается службой, которую я вызываю:
protected IEnumerable<RequestModel> ProcessResults(byte[] result) {
var serializer = new XmlSerializer(typeof(DataServiceModel));
var isoEncoder = Encoding.GetEncoding("ISO-8859-1");
var resultString = isoEncoder.GetString(result);
using (var xmlReader = new XmlTextReader(new StringReader(resultString))) {
var dataServiceModel = (DataServiceModel)serializer.Deserialize(xmlReader);
return dataServiceModel.Requests;
}
}
Все работает нормально до тех пор, пока последние две строки кода не десериализуют строку XML в объект, где я получаю сообщение об исключении: "В документе XML есть ошибка (1, 45)". который находится в начале тега DataService.
Полное сообщение об исключении:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>There is an error in XML document (1, 45).</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>...</StackTrace>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage><DataService xmlns=''> was not expected.</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataServiceModel.Read4_DataServiceModel()
</StackTrace>
</InnerException>
Оказывается, для меня будет работать следующее:
protected IEnumerable<Request> ProcessResults(byte[] result) {
var serializer = new XmlSerializer(typeof(Request[]), new XmlRootAttribute("DataService") {Namespace = ""});
var isoEncoder = Encoding.GetEncoding("ISO-8859-1");
var resultString = isoEncoder.GetString(result);
using (var xmlReader = new XmlTextReader(new StringReader(resultString))) {
var requests = (Request[])serializer.Deserialize(xmlReader);
return requests;
}
}
Со следующими модификациями класса Model:
public sealed class Request {
[XmlAttribute("ID")]
public int Id { get; set; }
[XmlAttribute("Status")]
public string Status { get; set; }
public DateTime TimeOffDate { get; set; }
public string TimeStart { get; set; }
public string TimeEnd { get; set; }
public decimal TimeOffHours { get; set; }
public string TimeOffTypeName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string LoginID { get; set; }
public string Comment { get; set; }
}
Это позволило мне полностью удалить класс DataServiceModel из решения.
result
- string
а не byte[]
.