Как я могу десериализовать список Xml с помощью Restsharp?

У меня есть xml, как это

<?xml version="1.0" encoding="utf-8"?> 
    <xml> 
            <item> 
                    <accountid>1</accountid> 
                    <accounttypeid>1</accounttypeid> 
                    <accounttypename/> 
                    <accountbankid>1</accountbankid> 
                    <accountbankname/> 
                    <accountsaldo>0</accountsaldo> 
            </item> 
            <item> 
                    <accountid>2</accountid> 
                    <accounttypeid>1</accounttypeid> 
                    <accounttypename/> 
                    <accountbankid>2</accountbankid> 
                    <accountbankname/> 
                    <accountsaldo>0</accountsaldo> 
            </item> 
            ... 
    </xml> 

Я хочу десериализовать этот список xml в объект POCO, который

public class Account 
{ 
        public string AccountId { get; set; } 
        public string AccountTypeId { get; set; } 
        public string AccountTypeName { get; set; } 
        public string AccountBankId { get; set; } 
        public string AccountBankName { get; set; } 
        public string AccountSaldo { get; set; } 
} 

Я нашел отличный продукт RestSharp для работы с остальным клиентом. Я хочу использовать его десериализатор, и я пробовал 2 подхода.

1) я пытался

request.RootElement = "item";

var response = Execute<Account>(request);

и я получил только первый элемент Item, что логично.

2) Когда я пытаюсь что-то вроде

request.RootElement = "xml";

var response = Execute<List<Account>>(request);

Я получил ноль.

Где я ошибаюсь в этом?

ОБНОВЛЕНИЕ: решение находится в комментариях к принятым ответам.


person nemke    schedule 02.11.2010    source источник


Ответы (2)


Это должно работать, если вы переименуете класс Account в Item и используете Execute<List<Item>>(request). Вам не нужно указывать значение RootElement.

person John Sheehan    schedule 02.11.2010
comment
Хм, я получил ErrorMessage = Индекс был за пределами массива. - person nemke; 03.11.2010
comment
Это работает, если вы установите RootElement = "xml";? Я думал, что это работает без этого, но, возможно, я неправильно помню. - person John Sheehan; 03.11.2010
comment
и если это не сработает, попробуйте установить RootElement и назвать класс item - person John Sheehan; 03.11.2010
comment
Нет, это не сработает. Я пробовал оба случая. Может быть, мне следует извлечь из github и создать тест для этого случая (добавив образец xml) - person nemke; 03.11.2010
comment
Я попробую сегодня вечером и выясню, что происходит. - person John Sheehan; 03.11.2010
comment
Хорошо, вот как я это сделал, не мог заснуть :) Я создал `открытый класс XmlItems: List‹item› { }, а затем Execute‹XmlItems›(запрос) - person nemke; 03.11.2010
comment
Это должно было стать моим следующим предложением :) Я думал, что RootElement + List<T> сработает. Наверное, должно. Если вы отправите тест, я буду мотивирован, чтобы добавить его. - person John Sheehan; 03.11.2010
comment
Почему необходимо унаследоваться от List‹T› в конкретный класс? Есть ли способ сделать это, все еще используя общий список? - person urig; 07.03.2017

Не уверен, что не так, но я уверен, что Джон скоро сообщит вам об этом :-) А пока, почему бы просто не сделать это вручную:

    var root = XElement.Parse(xmlString);
    var accounts = from it in root.Element("xml").Elements("item")
                   select new Account() {
                                            AccountId = it.Element("accountid").Value,
                                            AccountTypeId = it.Element("accounttypeid").Value,
                                            AccountTypeName = it.Element("accounttypename").Value,
                                            AccountBankId = it.Element("banktypeid").Value,
                                            AccountBankName = it.Element("banktypename").Value,
                                            AccountSaldo = it.Element("accountsaldo").Value
                                        };

Это так просто и просто с XLinq. Добавив несколько методов расширения в XElement, вы можете сделать его еще более чистым и устойчивым к отсутствующим элементам/атрибутам.

person Darrel Miller    schedule 02.11.2010
comment
Да, меня устраивает linq2xml, но я хотел создать клиентский API для быстрой разработки без необходимости ручного кодирования. Мне нужна рабочая вертикаль, чтобы показать коллегам. 10x за ответ в любом случае! - person nemke; 02.11.2010