Измените порядок узлов XML

#c# #linq-to-xml

#c# #linq-to-xml

Вопрос:

У меня есть некоторый XML, который выглядит примерно так:

 <root>
    <item>Banana</item>
    <item>Apple</item>
    <item>Cherry</item>
</root>
  

Это не те фактические данные, которые у меня есть, но они будут служить цели здесь. Что я хочу сделать, это использовать Linq to SQL для изменения порядка XML, чтобы дочерние узлы располагались в алфавитном порядке, например.

 <root>
    <item>Apple</item>
    <item>Banana</item>
    <item>Cherry</item>
</root>
  

Я хочу иметь возможность затем вызвать ToString() исходный XDocument и заставить его вернуть второй набор XML, как показано выше. Есть ли простой способ сделать это? Я пробовал искать, но безуспешно.

Ответ №1:

Возможно:

 var reordered = new XElement(
                    "root",
                    xdoc.Root.Elements("item")
                             .OrderBy(x => x.Value)
                             .Select(x => new XElement("item", x.Value)));
  

Или немного более гибкий (хотя и поддерживающий только 1 вложенный уровень):

 var reordered = new XElement(
                    xdoc.Root.Name,
                    xdoc.Root.Elements()
                             .OrderBy(x => x.Value)
                             .Select(x => new XElement(x.Name, x.Value)));
  

Комментарии:

1. @Дилан: всегда пожалуйста. Прелесть XLinq заключается в расширяемости конструкторов различных объектов. Я предлагаю прочитать функциональную конструкцию LINQ-to-XML , чтобы узнать больше.

2. Спасибо за ссылку. Проблема для меня заключалась в том, что я думал об этом под неправильным углом; я пытался изменить существующий XML, а не думал о создании нового XML для его замены.