2016-03-20 2 views
1

Мне нужно заполнить класс с помощью XML-файла.Заполнение класса с помощью запроса LINQ

<Ship> 
    <Name>Base Ship</Name> 
    <Owner>PG</Owner> 
    <Aim> 
     <Type>base</Type> 
     <Value>10</Value> 
     <Last>-1</Last> 
    </Aim> 
    <Aim> 
     <Type>cannon</Type> 
     <Value>10</Value> 
     <Last>2</Last> 
    </Aim> 
    <Dodge> 
     <Type>base</Type> 
     <Value>10</Value> 
     <Last>-1</Last> 
    </Dodge> 
    <EmPower> 
     <Type>base</Type> 
     <Value>10</Value> 
     <Last>-1</Last> 
    </EmPower> 
</Ship> 

Моя проблема заключается в том, чтобы заполнить Dictionary<string, CustomStruct>

Это struct:

public struct Stat 
{ 
    public int StatValue { get; set; } 
    public int StatLast { get; set; } 

    public Stat(int statValue, int statLast) 
    { 
     StatValue = statValue; 
     StatLast = statLast; 
    } 
} 

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

string loadDataPath = Application.persistentDataPath + "/saveData.xml"; 
XDocument loadData = XDocument.Load(loadDataPath); 

var query = from item in loadData.Elements("Ship") 
      select new Ship() 
      { 
       Name = (string) item.Element("Name"), 
       Owner = (string) item.Element("Owner"), 
       Aim = item.Elements("Aim") // <-- Here lies the problem. 
       // ... 
      }; 

Для каждого Aim XElements I необходимо заполнить словарь Aim, используя t он следующий метод:

Aim TKey = XML Type 
Aim TValue.StatValue = XML Value 
Aim TValue.StatLast = XML Last 
+0

Если вы посмотрите на мой обновленный ответ, вы также будете знать, почему 'struct' не работает. –

ответ

1

Используйте метод ToDictionary() расширения для достижения того, что вы хотите:

Aim = item.Elements("Aim").ToDictionary(x => (string)x.Element("Type"), x => new Stat(int.Parse((string)x.Element("Value")), int.Parse((string)x.Element("Last")))) 

Кроме того, я должен был изменить struct к class для Stat, для того, чтобы заставить его работать.

Если вы хотите использовать struct вам нужно изменить его немного:

public struct Stat 
{ 
    public int StatValue { get; set; } 
    public int StatLast { get; set; } 
    public Stat(int statValue, int statLast) : this() 
    { 
     StatValue = statValue; 
     StatLast = statLast; 
    } 
} 

получил от этого this answer.

+0

на item.Elements ("Aim"): Невозможно преобразовать тип аргумента экземпляра 'System.Collections.Generic.IEnumerable ' to 'System.Collections.Generic.IEnumerable ' – smark91

+0

@ smark91 try это теперь –

+0

@ FᴀʀʜᴀɴAɴᴀᴍ Просто FYI, в LINQ to XML правильный способ - использовать cast вместо 'Parse'. И вообще для XML лучше использовать методы 'XmlConvert', иначе вам всегда нужно передавать' CultureInfo.InvariantInfo' на каждый вызов 'Parse', который вы можете легко забыть (как вы это делали :) –

1

Вот правильный LINQ синтаксиса XML:

Aim = item.Elements("Aim").ToDictionary(
    e => (string)e.Element("Type"), 
    e => new Stat((int)e.Element("Value"), (int)e.Element("Last"))) 
+0

Обе работы, так что спасибо! – smark91

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