2008-10-22 4 views
7

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

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

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

Спасибо

ответ

1

Это должно сделать трюк. Он упорядочивает дочерние узлы корня на основе их содержимого и затем изменяет их порядок в документе. Это, вероятно, не самый эффективный способ, но, судя по вашим тегам, вы хотели увидеть его с помощью 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(); 
} 
1

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

4

Как описано выше, но обертывая его методом расширения. В моем случае это отлично подходит для меня, так как я просто хочу, чтобы в моем документе был применен определенный порядок элементов, прежде чем пользователь сохранит 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

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

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(); 
}