Как мне создать объект c-sharp, чтобы он соответствовал моему XML-ответу RestSharp?

Я только начал работать с RestSharp и с помощью NextFlix API смог успешно создать свои токены Oauth и запросить данные у NetFlix. Но по какой-то причине я не могу создать свои объекты, чтобы они правильно соответствовали возвращаемому XML.

Мой код:

    var client2 = new RestClient("http://api-public.netflix.com")
        {
            Authenticator = OAuth1Authenticator.ForProtectedResource(MyOauth.ConsumerKey, MyOauth.ConsumerSecret, MyOauth.OauthToken, MyOauth.OauthTokenSecret)
        };

        var request = new RestRequest("/catalog/titles/autocomplete");
        request.AddParameter("term", "star wars");
        var searchResults = client2.Execute<CatalogList>(request);

Моя попытка создания объекта:

  [XmlRoot("autocomplete")]
    public class CatalogList
    {
        public List<AutoCompleteItem> Titles { get; set; }
    }

    [XmlRoot("autocomplete_item")]
    public class AutoCompleteItem
    {
        [XmlElement("title short")]
        public string Title { get; set; }

        [XmlElement("short")]
        public string ShortName { get; set; }
    }

serachresults возвращает 20 заголовков, а в моем списке 20 записей, однако AutoCompleteItem всегда пуст. Я изменил имена элементов, атрибуты и т. д., но никогда не получаю правильную комбинацию.

Возвращаемый XML выглядит так:

<?xml version="1.0" standalone="yes" ?> 
<autocomplete>
<url_template>http://api-public.netflix.com/catalog/titles/autocomplete?{-join|&|term}   </url_template> 
<autocomplete_item>
<title short="Star Wars: Episode II: Attack of the Clones" /> 
</autocomplete_item>

Что мне здесь не хватает?

Спасибо,

Джейсон


person Jason    schedule 14.09.2012    source источник


Ответы (1)


[XmlRoot("autocomplete")]
public class AutocompleteList
{
    [XmlElement("url_template")]
    public string UrlTemplate { get; set; }

    [XmlElement("autocomplete_item")]
    public List<AutocompleteItem> Items { get; set; }
}

public class AutocompleteItem
{
    [XmlElement("title")]
    public Title ItemTitle { get; set; }
}

public class Title
{
    [XmlAttribute("short")]
    public string Short { get; set; }
}

Внутренний тип Title необходим для захвата XML-атрибута short=.

string xml = @"<?xml version=""1.0"" standalone=""yes"" ?>
<autocomplete>
    <url_template>http://api-public.netflix.com/catalog/titles/autocomplete?{-join|&amp;|term}</url_template>
    <autocomplete_item>
        <title short=""Star Wars: Episode II: Attack of the Clones"" />
    </autocomplete_item>
</autocomplete>";

var reader = new StringReader(xml);
var ser = new XmlSerializer(typeof(AutocompleteList));

var result = (AutocompleteList) ser.Deserialize(reader);

Это дает тот же результат, что и

var result = new AutocompleteList
{
    UrlTemplate = "http://api-public.netflix.com/catalog/titles/autocomplete?{-join|&|term}",
    Items = new List<AutocompleteItem>
    {
        new AutocompleteItem
        {
            ItemTitle = new Title
            {
                Short = "Star Wars: Episode II: Attack of the Clones",
            }
        },
    },
}
person Markus Jarderot    schedule 14.09.2012
comment
Теперь я получаю шаблон URL, но ItemTitle (все 20 из них) отображаются как нулевые. Возможно ли, что десериализатор RestSharp работает неправильно, и мне нужно сделать это самостоятельно? Или нужно доработать объект? Спасибо за помощь.. - person Jason; 15.09.2012
comment
ваш код отлично работает при десериализации xml вручную. Думаю, я просто пойду по этому пути. Не знаю, почему RestSharp не работает с ним. Вероятно, ошибка пользователя, я уверен. Но еще раз спасибо. - person Jason; 15.09.2012