XMLDeserialize для объекта ISO-8859-1

1

Я пытаюсь, безуспешно, десериализовать следующую строку 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>

  • 2
    вам не хватает элемента «Комментарий». Можете ли вы опубликовать полное исключение, которое вы видите?
  • 0
    Я не собираюсь использовать элемент Comment. Нужно ли включать?
Показать ещё 2 комментария
Теги:
xml-deserialization

1 ответ

0

Оказывается, для меня будет работать следующее:

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 из решения.

  • 0
    Что мне делать, если у меня уже есть строка? Т.е. мой result - string а не byte[] .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню