Конвертировать атрибуты XML в словарь в Linq в XML - PullRequest
3 голосов
/ 08 апреля 2010

У меня есть программа, которая должна преобразовать два атрибута определенного тега в ключ и значение Dictionary<code><int,string>. XML выглядит так:

(фрагмент)

<startingPoint coordinates="1,1" player="1" />

и пока мой LINQ выглядит примерно так:

XNamespace ns = "http://the_namespace";
var startingpoints = from sp in xml.Elements(ns+"startingPoint")
                 from el in sp.Attributes()
                 select el.Value;

Что дает мне хороший IEnumerable полный таких вещей, как "1,1" и "1", но должен быть способ адаптировать что-то вроде этого ответа для создания атрибутов вместо элементов. Маленькая помощь, пожалуйста? Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 апреля 2010

Я предполагаю, что вы хотите сохранить в словаре все игроки и их координаты начальной точки в словаре. Код для этого будет выглядеть так:

Dictionary<int, string> startingpoints = xml.Elements(ns + "startingPoint")
        .Select(sp => new { 
                              Player = (int)(sp.Attribute("player")), 
                              Coordinates = (string)(sp.Attribute("coordinates")) 
                          })
        .ToDictionary(sp => sp.Player, sp => sp.Coordinates);

Еще лучше, у вас был класс для хранения координат, например:

class Coordinate{
    public int X { get; set; }
    public int Y { get; set; }

    public Coordinate(int x, int y){
        X = x;
        Y = y;
    }

    public static FromString(string coord){
        try
        {
            // Parse comma delimited integers
            int[] coords = coord.Split(',').Select(x => int.Parse(x.Trim())).ToArray();
            return new Coordinate(coords[0], coords[1]);
        }
        catch
        {
            // Some defined default value, if the format was incorrect
            return new Coordinate(0, 0);
        }
    }
}

Тогда вы можете сразу разобрать строку в координаты:

Dictionary<int, string> startingpoints = xml.Elements(ns + "startingPoint")
        .Select(sp => new { 
                              Player = (int)(sp.Attribute("player")), 
                              Coordinates = Coordinate.FromString((string)(sp.Attribute("coordinates"))) 
                          })
        .ToDictionary(sp => sp.Player, sp => sp.Coordinates);

После этого вы можете получить доступ к координатам игроков следующим образом:

Console.WriteLine(string.Format("Player 1: X = {0}, Y = {1}", 
                                startingpoints[1].X, 
                                startingpoints[1].Y));
0 голосов
/ 08 апреля 2010

Я думаю, вы хотите сделать что-то вроде этого

string xml = @"<root>
                <startingPoint coordinates=""1,1"" player=""1"" />
                <startingPoint coordinates=""2,2"" player=""2"" />
               </root>";

XDocument document = XDocument.Parse(xml);

var query = (from startingPoint in document.Descendants("startingPoint")
             select new
             {
                 Key = (int)startingPoint.Attribute("player"),
                 Value = (string)startingPoint.Attribute("coordinates")
             }).ToDictionary(pair => pair.Key, pair => pair.Value);

foreach (KeyValuePair<int, string> pair in query)
{
    Console.WriteLine("{0}\t{1}", pair.Key, pair.Value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...