C # XML десериализация без ошибок - PullRequest
0 голосов
/ 24 мая 2019

В настоящее время я пытаюсь десериализовать строку xml в объект C #.Я не получаю ошибок.Просто ничего не заканчивается в списке.

XML содержится в URL.Я использовал конвертер объектов xml в C # для создания объекта.

Вот код десериализации:

    public static List<Models.Betway.EventList> GetEvents()
    {
        string res = "";
        Uri myURI = new Uri("http://feeds.betway.com/events?key=CEBA7C11&keywords=horse-racing,uk-and-ireland&and=true");

        WebRequest webRequest = WebRequest.Create(myURI);
        webRequest.Timeout = 2000;

        using (WebResponse webResponse = webRequest.GetResponse())
        {
            using (Stream stream = webResponse.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                res = reader.ReadToEnd();
            }
        }

        XmlSerializer serializer = new XmlSerializer(typeof(List<Models.Betway.EventList>), new XmlRootAttribute("EventList"));
        StringReader stringReader = new StringReader(res);

        List<Models.Betway.EventList> list = (List<Models.Betway.EventList>)serializer.Deserialize(stringReader);

        return list;
    }

Вот моя модель класса объектов, которую я создал с помощью онлайн-конвертера:

 using System;
 using System.Xml.Serialization;
 using System.Collections.Generic;

namespace tf.PriceService.Core.Models.Betway
{

[XmlRoot(ElementName = "Keyword")]
public class Keyword
{
    [XmlAttribute(AttributeName = "type_cname")]
    public string Type_cname { get; set; }
    [XmlAttribute(AttributeName = "cname")]
    public string Cname { get; set; }
    [XmlText]
    public string Text { get; set; }
}

[XmlRoot(ElementName = "Keywords")]
public class Keywords
{
    [XmlElement(ElementName = "Keyword")]
    public List<Keyword> Keyword { get; set; }
}

[XmlRoot(ElementName = "Outcome")]
public class Outcome
{
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
    [XmlElement(ElementName = "Quicklink")]
    public string Quicklink { get; set; }
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }
    [XmlAttribute(AttributeName = "index")]
    public string Index { get; set; }
    [XmlAttribute(AttributeName = "type_cname")]
    public string Type_cname { get; set; }
    [XmlAttribute(AttributeName = "cname")]
    public string Cname { get; set; }
    [XmlAttribute(AttributeName = "starting_price")]
    public string Starting_price { get; set; }
    [XmlAttribute(AttributeName = "price_num")]
    public string Price_num { get; set; }
    [XmlAttribute(AttributeName = "price_den")]
    public string Price_den { get; set; }
    [XmlAttribute(AttributeName = "price_dec")]
    public string Price_dec { get; set; }
}

[XmlRoot(ElementName = "Market")]
public class Market
{
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
    [XmlElement(ElementName = "Outcome")]
    public List<Outcome> Outcome { get; set; }
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }
    [XmlAttribute(AttributeName = "index")]
    public string Index { get; set; }
    [XmlAttribute(AttributeName = "type_cname")]
    public string Type_cname { get; set; }
    [XmlAttribute(AttributeName = "cname")]
    public string Cname { get; set; }
    [XmlAttribute(AttributeName = "handicap")]
    public string Handicap { get; set; }
    [XmlAttribute(AttributeName = "situation_index")]
    public string Situation_index { get; set; }
    [XmlAttribute(AttributeName = "each_way_active")]
    public string Each_way_active { get; set; }
    [XmlAttribute(AttributeName = "each_way_fraction_den")]
    public string Each_way_fraction_den { get; set; }
    [XmlAttribute(AttributeName = "each_way_position")]
    public string Each_way_position { get; set; }
    [XmlAttribute(AttributeName = "tricast")]
    public string Tricast { get; set; }
    [XmlAttribute(AttributeName = "forecast")]
    public string Forecast { get; set; }
    [XmlAttribute(AttributeName = "interval_from")]
    public string Interval_from { get; set; }
    [XmlAttribute(AttributeName = "interval_to")]
    public string Interval_to { get; set; }
}

[XmlRoot(ElementName = "Event")]
public class Event
{
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
    [XmlElement(ElementName = "Quicklink")]
    public string Quicklink { get; set; }
    [XmlElement(ElementName = "Keywords")]
    public Keywords Keywords { get; set; }
    [XmlElement(ElementName = "Market")]
    public List<Market> Market { get; set; }
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }
    [XmlAttribute(AttributeName = "cname")]
    public string Cname { get; set; }
    [XmlAttribute(AttributeName = "start_at")]
    public string Start_at { get; set; }
    [XmlAttribute(AttributeName = "home_team_cname")]
    public string Home_team_cname { get; set; }
    [XmlAttribute(AttributeName = "away_team_cname")]
    public string Away_team_cname { get; set; }
    [XmlAttribute(AttributeName = "started")]
    public string Started { get; set; }
}

[XmlRoot(ElementName = "EventList")]
public class EventList
{
    [XmlElement(ElementName = "Event")]
    public List<Event> Event { get; set; }
}

}

Как видите, я объявляю EventList в качестве корня.Но это все еще не десериализация.

1 Ответ

0 голосов
/ 24 мая 2019

Вы должны десериализовать один EventList экземпляр:

public static EventList GetEvents()
{
    /// ...
    XmlSerializer serializer = new XmlSerializer(typeof(EventList));
    // ...
    EventList list = (EventList)serializer.Deserialize(stringReader);

    return list;
}

или, в качестве альтернативы, вернуть List<Event>:

public static List<Event> GetEvents()
{
    /// ...
    XmlSerializer serializer = new XmlSerializer(typeof(EventList));
    // ...
    EventList list = (EventList)serializer.Deserialize(stringReader);

    return list.Event;
}

Также, чтобыизбегайте некоторых накладных расходов:

using (WebResponse webResponse = webRequest.GetResponse())
using (Stream stream = webResponse.GetResponseStream())
using (var reader = XmlReader.Create(stream))
{
    XmlSerializer serializer = new XmlSerializer(typeof(EventList));
    EventList list = (EventList)serializer.Deserialize(reader);
    return list;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...