2012-09-03 3 views
1

Я хочу читать XML следующим образом.Использование Xml для создания списка

<?xml version="1.0" encoding="utf-8" ?> 
<parent> 
    <path> 
    <pathPoints> 
    <point> 
     2 0 
     </point> 
     <point> 
     2 1 
     </point> 
     3 1 
     <point> 
     3 2 
     </point> 
     <point> 
     4 2 
     </point> 
     <point> 
     4 4 
     </point> 
     <point> 
     3 4 
     </point> 
     <point> 
     3 5 
     </point> 
     <point> 
     2 5 
     </point> 
     <point> 
     2 7 
     </point> 
     <point> 
      7 7 
     </point> 
     <point> 
      7 5 
     </point> 
     <point> 
     10 5 
     </point> 
     <point> 
     10 2 
     <point> 
     </point> 
     15 2 
     </point> 
     <point> 
     15 6 
     </point> 
     <point> 
     16 6 
     </point> 
     <point> 
     16 7 
     </point> 
     <point> 
     17 7 
     </point> 
     <point> 
     17 10 
     </point> 
     <point> 
     19 10 
     </point> 
    </pathPoints> 
    </parent> 
</path> 

И теперь я пытаюсь читать:

 paths = (from path in doc.Descendants("path") 
       select new AIPath() 
       { 
        waypoints = (from i in path.Descendants("pathPoints") 
        { 
         int j = Convert.ToInt32(i.Element("point").Value), 
        }).ToList(); 
       } 
       ).ToList(); 

Мой AIPath содержит список Vector2 называется путевых точек.

Что я хочу знать, это то, что я делаю неправильно. Я хочу создать новый путь каждый раз, когда он изменит тот путь, на который он смотрит, и выглядит отлично. То, о чем я смущаюсь, хотя и нужно сделать дальше. После того, как путевые точки = (от I в path.Descendants («pathPoints»), я ожидаю, что я должен сделать что-то, но я невежествен, как и к чему.

Любая помощь будет принята с благодарностью.

.. Редактировать

Один или две детали я забыл добавить

public class AIPath 
{ 
    //public Vector2 
    public List<Vector2> waypoints { get; set; } 
    public int linkNumber { get; set; } 
    public int[] potentialLinks { get; set; } 
} 
+0

Мы не знаем, что выглядит ваш 'тип AIPath', как, что делает его трудно помочь. Кроме того, вы не сказали нам, что делает ваш * текущий * код. (Похоже, что это в основном синтаксическая ошибка ...) –

+0

Кроме того, в настоящее время вы пытаетесь проанализировать элемент 'point' как * одно целое число, когда оно явно содержит * два * целых числа. Можете ли вы изменить формат XML? Похоже, было бы намного чище, если бы два значения были установлены как атрибуты элементов 'point' ... –

+0

@JonSkeet да, я могу изменить формат, и мне нужно получить X и Y. Это было больше, чтобы проиллюстрировать, что Я делал это раньше. Я добавил свой класс пути AI. В настоящий момент это не работает, потому что я не могу понять, что мне нужно добавить, чтобы сообщить синтаксическому анализатору xml добавить все элементы точек пути, которые он находит в таблицу путевых точек AIPath. – Bushes

ответ

1

в настоящее время, ваш вывод XML является относительно трудно разобрать, я бы переписать код так:

public sealed class AIPath 
{ 
    // TODO: Consider trying to make this immutable, or 
    // at least not exposing the collections so widely. Exposing an array 
    // property is almost always a bad idea. 
    public List<Vector2> Waypoints { get; set; } 
    public int LinkNumber { get; set; } 
    public int[] PotentialLinks { get; set; } 

    public XElement ToElement() 
    { 
     return new XElement("path", 
      WayPoints.Select(v2 => new XElement("point", 
             new XAttribute("X", (int) v2.X), 
             new XAttribute("Y", (int) v2.Y)))); 
    } 

    public static AIPath FromXElement(XElement path) 
    { 
     return new AIPath 
     { 
      WayPoints = path.Elements("point") 
          .Select(p => new Vector2((int) p.Attribute("X"), 
                (int) p.Attribute("Y"))) 
          .ToList(); 
     }; 
    } 
} 

Тогда:

paths = doc.Descendants("path") 
      .Select(x => AIPath.FromXElement(x)) 
      .ToList(); 
+0

Хорошо, я дам это. Большое спасибо. – Bushes

1

Джон ответа тарелочек вероятно, будет работать, но структура XNA предлагает гораздо более простой способ чтения XML в ваши объекты с помощью конвейера содержимого.

Пример XML:

<?xml version="1.0" encoding="utf-8"?> 
<XnaContent> 
    <Asset Type="MyDataTypes.CatData[]"> 
    <Item> 
     <Name>Rhys</Name> 
     <Weight>17</Weight> 
     <Lives>9</Lives> 
    </Item> 
    <Item> 
     <Name>Boo</Name> 
     <Weight>11</Weight> 
     <Lives>5</Lives> 
    </Item> 
    </Asset> 
</XnaContent> 

Пример Класс:

namespace MyDataTypes 
{ 
    public class CatData 
    { 
     public string Name; 
     public float Weight; 
     public int Lives; 
    } 
} 

Встроенный XML импортер и обработчик содержимого трубопровода будет ассоциировать XML элементы с правильно названными членами класса при строительстве. xnb, предполагая, что вы правильно пометили элемент «Тип актива».

См: http://msdn.microsoft.com/en-us/library/ff604981.aspx

+0

Использование '[XmlAttribute]' и '[XmlElement]' также полезно, если вы хотите больше контролировать сериализацию ваших XML-файлов по именам элементов/атрибутов. –

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