2008-10-22 27 views
7

Quiero cambiar el orden de XML usando XDocumentCambia el orden de XML usando XDocument

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

quiero cambiar el orden de modo que 2 aparece antes de 1. Es esta capacidad al horno en o tengo que hacer yo mismo. Por ejemplo, eliminar entonces AddBeforeSelf()?

Gracias

Respuesta

1

Esto debería hacer el truco. Ordena los nodos secundarios de la raíz en función de su contenido y luego cambia su orden en el documento. Es probable que esta no sea la forma más efectiva, pero a juzgar por sus etiquetas, quería verla con 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

Fuera de escribir el código C# para lograr esto, puede usar XSLT para transformar el XML.

4

Similar a la anterior, pero envolviéndola en un método de extensión. En mi caso, esto funciona bien para mí, ya que solo quiero asegurar que se aplique un cierto orden de elementos en mi documento antes de que el usuario guarde el 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

Pruebe esta solución ...

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