Изменить порядок XML с помощью XDocument - PullRequest
7 голосов
/ 22 октября 2008

Я хочу изменить порядок XML с помощью XDocument

<root>
  <one>1</one>
  <two>2</two>
</root>

Я хочу изменить порядок так, чтобы 2 отображался раньше 1. Эта способность включена, или я должен сделать это сам. Например, удалить затем AddBeforeSelf ()?

Спасибо

Ответы [ 4 ]

4 голосов
/ 06 апреля 2009

Аналогично вышеописанному, но перенос в метод расширения. В моем случае это хорошо работает для меня, так как я просто хочу убедиться, что определенный порядок элементов применяется в моем документе, прежде чем пользователь сохранит XML.

public static class XElementExtensions
{
    public static void OrderElements(this XElement parent, params string[] orderedLocalNames)
    {            
        List<string> order = new List<string>(orderedLocalNames);            
        var orderedNodes = parent.Elements().OrderBy(e => order.IndexOf(e.Name.LocalName) >= 0? order.IndexOf(e.Name.LocalName): Int32.MaxValue);
        parent.ReplaceNodes(orderedNodes);
    }
}
// using the extension method before persisting xml
this.Root.Element("parentNode").OrderElements("one", "two", "three", "four");
1 голос
/ 15 октября 2010

Попробуйте это решение ...

XElement node = ...get the element...

//Move up
if (node.PreviousNode != null) {
    node.PreviousNode.AddBeforeSelf(node);
    node.Remove();
}

//Move down
if (node.NextNode != null) {
    node.NextNode.AddAfterSelf(node);
    node.Remove();
}
1 голос
/ 24 ноября 2008

За пределами написания кода C # для этого вы можете использовать XSLT для преобразования XML.

1 голос
/ 22 октября 2008

Это должно сработать. Он упорядочивает дочерние узлы корня на основе их содержимого, а затем изменяет их порядок в документе. Вероятно, это не самый эффективный способ, но, судя по вашим тегам, вы хотели видеть его с помощью LINQ.

static void Main(string[] args)
{
    XDocument doc = new XDocument(
        new XElement("root",
            new XElement("one", 1),
            new XElement("two", 2)
            ));

    var results = from XElement el in doc.Element("root").Descendants()
                  orderby el.Value descending
                  select el;

    foreach (var item in results)
        Console.WriteLine(item);

    doc.Root.ReplaceAll( results.ToArray());

    Console.WriteLine(doc);

    Console.ReadKey();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...