Как разобрать данные XML в свойствах пользовательского класса C #?

Настроить

У меня есть это в моемMain() функция.

List<Token> tokens = new List<Token>();
string path = @"\(some directories)\tokens.xml";
XDocument doc = XDocument.Load(path);

У меня есть этот класс с несколькими свойствами.

public partial class Token
{
    public Token()
    {
        SetURLs = new List<string>();
        SetNames = new List<string>();
    }

    public string Name { get; set; }
    public List<string> SetURLs { get; set; }
    public List<string> SetNames { get; set; }
    public string Color { get; set; }
    public string PT { get; set; }
    public string Text { get; set; }
}

У меня есть этот файл XML. Вот фрагмент.

<?xml version="1.0" encoding="UTF-8"?> //EDIT3
<card_database version="2">            //EDIT3
    <cards>
        .
        .
        .
        <card>
            <name>Griffin</name>
            <set picURL="http://magiccards.info/extras/token/duel-decks-ajani-vs-nicol-bolas/griffin.jpg" picURLHq="" picURLSt="">DDH</set>
            <color>w</color>
            <manacost></manacost>
            <type>Token</type>
            <pt>2/2</pt>
            <tablerow>0</tablerow>
            <text>Flying</text>
            <token>1</token>
        </card>
        <card>
            <name>Rat</name>
            <set picURL="http://magiccards.info/extras/token/shadowmoor/rat.jpg" picURLHq="" picURLSt="">SHM</set>
            <set picURL="http://magiccards.info/extras/token/gatecrash/rat.jpg" picURLHq="" picURLSt="">GTC</set>
            <color>b</color>
            <manacost></manacost>
            <type>Token</type>
            <pt>1/1</pt>
            <tablerow>0</tablerow>
            <text></text>
            <token>1</token>
        </card>
        .
        .
        .
    </cards>
</card_database> //EDIT3

Как видите, есть много<card> элементы в<cards> корневой элемент. Далее каждый<card> может иметь много<set> элементы. Я сделал класс соответственно.

проблема

Как пройти через один<card> и назначить соответствующие значения для каждого свойства?

Что я попробовал

Я сделал список, который содержит все<name> элементы каждого<card>, Затем я бы прошел через этот список и назначил имя для нового экземпляраToken классаName свойство. Тогда заселите мойtokens список с каждым новым экземпляром.

List<string> names = new List<string>();
names = doc.Descendants("card").Elements("name").Select(r => r.Value).ToList();
int amount = doc.Descendants("card").Count();

for(int i = 0; i < amount; i++)
{
    Token token = new Token();

    token.Name = name[i];

    .
    .
    .

    tokens.Add(token);
}

Я думаю, я мог бы тогда сделать больше списков, которые содержат каждый другой желаемый элемент и выполнять тот же процесс, но должен быть более элегантный способ, верно?

РЕДАКТИРОВАТЬ

Я также попробовал сериализацию из другого вопроса. Но почему-то, когда я пытался написать что-то изtoken к консоли (скажем, token.Name) ничего не написано.

XmlSerializer serializer = new XmlSerializer(typeof(Token));
using (StringReader reader = new StringReader(path))
{
    Token token = (Token)(serializer.Deserialize(reader));
}

Вероятно, просто неправильная реализация. Если это так, может ли кто-нибудь использовать то, что я написал, и показать мне правильную реализацию? Кроме того, я предполагаю, что это даст 1 или много значений моим двумList свойства, верно?

РЕДАКТИРОВАТЬ

Спасибо за помощь.

EDIT2

Ответ

После некоторых неудачных попыток возиться с сериализацией и поиском, я сделал реализацию, которая работает.

foreach (var card in doc.Descendants("card"))
{
    Token token = new Token();

    token.Name = card.Element("name").Value.ToString();
    foreach (var set in card.Elements("set"))
    {
        token.SetURLs.Add(set.Attribute("picURL").Value.ToString());
        token.SetNames.Add(set.Value.ToString());
    }
    token.Color = card.Element("color").Value.ToString();
    token.PT = card.Element("pt").Value.ToString();
    token.Text = card.Element("text").Value.ToString();

    tokens.Add(token);
}

Гораздо лучше, чем количествоLists Я сначала имел в виду. Не так кратко, как могла бы быть сериализация. Тем не менее, он делает то, что мне нужно.

Спасибо за помощь.

EDIT4

Не уверен, разрешено ли это много правок или против этикета. Просто хотел сделать это редактирование для будущих читателей.

Материал в разделе «Ответ» решает мою проблему, но XML-сериализация, опубликованная ниже Дейвом, намного лучше; это более гибкий и простой в использовании / изменении. Итак, выберите решение, которое имеет больше преимуществ для вашей ситуации.

Ответы на вопрос(3)

Ваш ответ на вопрос