Как выполнить иерархический запрос LINQ to XML? - PullRequest
0 голосов
/ 16 ноября 2011

Я знаю, что могу сделать это итеративно, но было бы здорово сделать это одним оператором LINQ.

У меня есть какой-то XML, который выглядит следующим образом:

<parent name="george">
  <child name="steve" age="10" />
  <child name="sue" age="3" />
  <pet type="dog" />
  <child name="jill" age="7" />
</parent>
<!-- ... -->

и я хочу написать оператор LINQ to XML, чтобы превратить его в

<node type="parent" label="george">
  <node type="child" label="steve" years="10 />
  <node type="child" label="sue" years="3" />
  <node type="child" label="jill" years="7" />
  <!-- no pets! -->
</parent>
<!-- ... -->

Возможно ли это в одном операторе LINQ to XML?

Я включил два оператора from в оператор LINQ ранее, но не второй select, что, по-видимому, и потребуется.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Вам нужно будет запросить нужные элементы и создать новые элементы и атрибуты, используя запрашиваемые элементы.Примерно так должно работать:

var input = @"<root>
    <parent name=""george"">
        <child name=""steve"" age=""10"" />
        <child name=""sue"" age=""3"" />
        <pet type=""dog"" />
        <child name=""jill"" age=""7"" />
    </parent>
</root>";

var xml = XElement.Parse(input);
var query = from p in xml.Elements("parent")
            select new XElement("node",
                new XAttribute("type", p.Name),
                new XAttribute("label", p.Attribute("name").Value),
                from c in p.Elements("child")
                select new XElement("node",
                    new XAttribute("type", c.Name),
                    new XAttribute("label", c.Attribute("name").Value),
                    new XAttribute("years", c.Attribute("age").Value)));
1 голос
/ 16 ноября 2011

Быстро и грязно:

doc.Elements("parent")
            .Select(p =>
                new XElement("node",
                        new XAttribute("type", p.Name),
                        new XAttribute("label", p.Attribute("name") != null ? p.Attribute("name").Value : ""),
                        p.Elements("child")
                            .Select(c =>
                                    new XElement("node",
                                    new XAttribute("type", c.Name),
                                    new XAttribute("label", c.Attribute("name") != null ? c.Attribute("name").Value : ""),
                                    new XAttribute("years", c.Attribute("age") != null ? c.Attribute("age").Value : ""))
                                )
                        )
                );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...