Linq to XML выбирает список детей - PullRequest
0 голосов
/ 01 декабря 2011

Пример XML-файла:

<?xml version="1.0" encoding="UTF-8"?>
<game>
    <name>bomber</name>
    <behaviors-used>
        <behavior id="Bullet" version="1">Bullet</behavior>
        <behavior id="Fade" version="1">Fade</behavior>
        <behavior id="Flash" version="1">Flash</behavior>
        <behavior id="Sin" version="1">Sine</behavior>
        <behavior id="scrollto" version="1">Scroll To</behavior>
    </behaviors-used>
</game>

У меня есть запрос:

var data = (from item in loaded.Descendants("game")
            select new
            {
                name = item.Element("name").Value,
                behaviorlist = item.Element("behaviors-used").Value
            }).Single();

Что, кажется, работает нормально. Однако теперь мне нужно получить все элементы <behavior> в behaviorlist. Я не могу сделать это так:

var bq = (from c in data.behaviorlist select new { behaviour = c.Element("behaviour")});

(генерирует неверные синтаксические ошибки).

Как получить все поведения и получить доступ не только к их тексту, но и к свойствам id и version?

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

id и version являются атрибутами узла behavior:

var items =
    xDocument.Descendants("behaviors-used")
             .Descendants("behavior")
             .Select((w, i) =>
                new
                    {
                        Index = i,
                        Value = w.Value,
                        Id = w.Attribute("id").Value,
                        Version = w.Attribute("version").Value
                    })
             .ToList();
1 голос
/ 01 декабря 2011

удалось заставить это работать в LinqPad с вашим документом:

  var data = (from item in loaded.DescendantsAndSelf("game")
            select new{
                       name = item.Element("name").Value,
                       behaviorlist = item.Element("behaviours-used")
                      }
            ).Single();

  var bq = (from c in data.behaviorlist.Descendants("behaviour")
            select new {
                         behaviour = c.Value,
                         id = c.Attribute("id").Value,
                         version = c.Attribute("version").Value
                        });

и дал последовательность из 5 анонимных объектов {поведение, идентификатор, версия}

1 голос
/ 01 декабря 2011

Ваш behaviorlist на самом деле не является списком прямо сейчас - вы хотите, чтобы элементы не представляли собой объединенный текст, поэтому вместо использования свойства Value родительского узла вы должны получить Elements с именем «поведение»:

var data = (from item in loaded.Descendants("game")
            select new
            {
                name = item.Element("name").Value,
                behaviorlist = item.Element("behaviors-used").Elements("behavior")
            }).Single();

Из полученного списка вы можете легко получить свойства:

var bq = (from c in data.behaviorlist select new 
{ 
    id = c.Attribute("id").Value,
    version = c.Attribute("version").Value,
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...