2016-12-15 2 views
0

У меня есть XML-файл с 600+ pokemon, каждый pokemon имеет базовую статистику, когда покемон выбран из выпадающего списка, который я хочу загрузить в базовой статистике покемонов.Загрузка pokemon из файла xml по имени

XML файл выглядит следующим образом:

<Pokemon> 
    <Name>Bulbasaur</Name> 

    <BaseStats> 
    <Health>5</Health> 
    <Attack>5</Attack> 
    <Defense>5</Defense> 
    <SpecialAttack>7</SpecialAttack> 
    <SpecialDefense>7</SpecialDefense> 
    <Speed>5</Speed> 
    </BaseStats> 
</Pokemon> 
<Pokemon> 
    <Name>Ivysaur</Name> 

    <BaseStats> 
    <Health>7</Health> 
    <Attack>7</Attack> 
    <Defense>6</Defense> 
    <SpecialAttack>9</SpecialAttack> 
    <SpecialDefense>8</SpecialDefense> 
    <Speed>5</Speed> 
    </BaseStats> 
</Pokemon> 

Мой код:

XDocument pokemonDoc = XDocument.Load(@"c:\users\reece\documents\visual studio 2015\Projects\Pokesheet\Pokesheet\Files\pokemon.xml"); 

var pokemon = pokemonDoc.Descendants("Pokemon").Select(x => new 
{ 
    name = (string)x.Element("Name"), 
    health = (int)x.Element("BaseStats").Element("Health"), 
    attack = (int)x.Element("BaseStats").Element("Attack"), 
    defense = (int)x.Element("BaseStats").Element("Defense"), 
    specialAttack = (int)x.Element("BaseStats").Element("SpecialAttack"), 
    specialDefense = (int)x.Element("BaseStats").Element("SpecialDefense"), 
    speed = (int)x.Element("BaseStats").Element("Speed"), 
}); 

baseHp.Value = pokemon.health; 
baseAttack.Value = pokemon.attack; 
baseDefense.Value = pokemon.defense; 
baseSpAttack.Value = pokemon.specialAttack; 
baseSpDefense.Value = pokemon.specialDefense; 
baseSpeed.Value = pokemon.speed; 

Я хочу это только создать покемон, когда имя в файле XML совпадает с именем выбирает пользователь, Как мне это сделать?

+0

«Может кто-то, пожалуйста, помогите мне в этом» - Помогите вам что делать? Какой у Вас вопрос? Вы где-нибудь получаете исключение? – Quantic

+1

У вас нет времени прямо сейчас, но вам не хватает 'Where', чтобы выбрать Pokemon, который вы ищете, и' Single', чтобы иметь правильный тип данных ... –

+0

«Я хочу, чтобы это создавало только pokemon когда имя в файле xml совпадает с именем, которое пользователь выбирает «в настоящее время он создает каждый покемон в XML-файле (который мне не нужен), есть способ его ограничить, чтобы он создавал только« покемон », когда покемон имя элемента равно тому, что выбрал пользователь –

ответ

0

Спасибо, ребята, я использовал ваши ответы , но мы сравнивали их неправильно в заявлении о том, что готовый ответ таков:

var pokemon = pokemonDoc.Descendants("Pokemon").Select(x => new 
     { 

      name = (string)x.Element("Name"), 
      health = (int)x.Element("BaseStats").Element("Health"), 
      attack = (int)x.Element("BaseStats").Element("Attack"), 
      defense = (int)x.Element("BaseStats").Element("Defense"), 
      specialAttack = (int)x.Element("BaseStats").Element("SpecialAttack"), 
      specialDefense = (int)x.Element("BaseStats").Element("SpecialDefense"), 
      speed = (int)x.Element("BaseStats").Element("Speed"), 

     }).Where(x => x.name.ToString() == cbSpecies.SelectedItem.ToString()).FirstOrDefault(); 

     baseHp.Value = pokemon.health; 
     baseAttack.Value = pokemon.attack; 
     baseDefense.Value = pokemon.defense; 
     baseSpAttack.Value = pokemon.specialAttack; 
     baseSpDefense.Value = pokemon.specialDefense; 
     baseSpeed.Value = pokemon.speed; 
+0

Просьба представить полный образец вашего кода в следующий раз – Thomas

2
var pokemon = pokemonDoc.Descendants("Pokemon").Select(x => new 
    { 

     name = (string)x.Element("Name"), 
     health = (int)x.Element("BaseStats").Element("Health"), 
     attack = (int)x.Element("BaseStats").Element("Attack"), 
     defense = (int)x.Element("BaseStats").Element("Defense"), 
     specialAttack = (int)x.Element("BaseStats").Element("SpecialAttack"), 
     specialDefense = (int)x.Element("BaseStats").Element("SpecialDefense"), 
     speed = (int)x.Element("BaseStats").Element("Speed"), 

    }).Where(x => x.name == "yourName").FirstOrDefault(); 

Это должно принести вам покемон для выбранного имени или нулевое значение, если он не находит

+0

Вы должны сначала вызвать 'Where', а' Select' в конце выражения лямбда – Thomas

+0

. Сначала вы должны позвонить, чтобы не создавать классы для тех, кого вы не хотите. Вы также можете использовать FirstOrDefaul (x => x.name == "yourName") – Carra

1

Это должно сделать трюк:

// Your user selected pokemon 
string selectedPokemon = pokemonFromDropDownList.name; 

var pokemon = pokemonDoc.Descendants("Pokemon").Where(p => p.name == selectedPokemon).Select(x => new 
{ 

    name = (string)x.Element("Name"), 
    health = (int)x.Element("BaseStats").Element("Health"), 
    attack = (int)x.Element("BaseStats").Element("Attack"), 
    defense = (int)x.Element("BaseStats").Element("Defense"), 
    specialAttack = (int)x.Element("BaseStats").Element("SpecialAttack"), 
    specialDefense = (int)x.Element("BaseStats").Element("SpecialDefense"), 
    speed = (int)x.Element("BaseStats").Element("Speed"), 

}); 

    // Then do what ever you want with it 
    if(pokemon != null) 
    { 
     baseHp.Value = pokemon.health; 
     baseAttack.Value = pokemon.attack; 
     baseDefense.Value = pokemon.defense; 
     baseSpAttack.Value = pokemon.specialAttack; 
     baseSpDefense.Value = pokemon.specialDefense; 
     baseSpeed.Value = pokemon.speed; 
    } 
    else 
    { 
     // Do stuff if it not exist... 
    } 
+1

Существует более одного способа скинуть кошку. Томас фильтрует XML-файл. Следующий код фильтрует результаты или исходный код: var abcPokemon = pokemon.Where (x => x.name == "abc"). First(); – jdweng

Смежные вопросы