c# - tutorial - Cambiar el orden de XML usando XDocument
system xml linq example c# (4)
Esto debería funcionar. 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();
}
Quiero cambiar el orden de XML usando XDocument
<root>
<one>1</one>
<two>2</two>
</root>
Quiero cambiar el orden para que 2 aparezca antes 1. ¿Se ha incorporado esta capacidad o tengo que hacerlo yo mismo? Por ejemplo, eliminar entonces AddBeforeSelf ()?
Gracias
Aparte de escribir el código C # para lograr esto, puede usar XSLT para transformar el XML.
Similar a la anterior, pero envolviéndolo 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");
Prueba 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();
}