Saltar al contenido

Herramienta de clasificación/formato XML

Este equipo de redactores ha estado horas buscando para dar resolución a tus dudas, te dejamos la resolución y esperamos serte de mucha ayuda.

Solución:

Me gustó esta herramienta: https://xmlsorter.codeplex.com/

Puede ordenar por nombre de etiqueta y attributes. Me gusta usarlo antes de comparar algunos archivos XML.

Ventana principal del Clasificador XML

Estaba buscando una utilidad similar y realmente no encontré lo que estaba buscando, así que apenas escribí una en su lugar. Es muy simple (y no incluye attributes en la clasificación de nodos), pero funciona.

Tal vez sea útil para otros… Está en GitHub.

Aquí hay un poco de la página de GitHub…

USAGE: sortxml.exe [options] infile [outfile]

  infile      The name of the file to sort, etc.
  outfile     The name of the file to save the output to.
              If this is omitted, then the output is written to stdout.

OPTIONS:

  --pretty    Ignores the input formatting and makes the output look nice.
  --sort      Sort both the nodes and attributes.
  --sortnode  Sort the nodes.
  --sortattr  Sort the attributes.

(prefix an option with ! to turn it off.)

El valor predeterminado es generar nodos bonitos y ordenados y attributes. Aquí hay un ejemplo:

> type sample.xml


> sortxml.exe sample.xml


  

Debido a la frustración con Visual Studio, que parece reordenar y reescribir archivos EDMX (Entity Framework) todo el tiempo (ver también esta voz de usuario), escribí un código Linqpad para reordenar cosas. Sin embargo, es fácil (y obvio) de usar fuera de LinqPad.

Ordena los elementos por tipo de elemento (etiqueta), luego por el valor del elemento-attribute “Nombre”, y luego por algunas otras cosas para tratar de hacerlo algo determinista (diferente xml, pero el mismo significado, es [usually] misma salida – ver código).

También ordena la attributes. Tenga en cuenta que semánticamente XML-attributes puede no tener orden (relevante), pero textualmente lo hacen, y los sistemas de control de versiones todavía los consideran texto sin formato…

(Tenga en cuenta que no corrige los diferentes alias, mencionados en el archivo edmx de Entity Framework que se regenera de manera diferente entre el equipo)

void Main()

    XDocument xdoc = XDocument.Load(@"\filepath1file1.edmx");

    var orderedElements = CopyAndSortElements(xdoc.Elements());

    var newDoc = new XDocument();
    newDoc.Add(orderedElements);
    newDoc.Save(@"\filepath1file1.Ordered.edmx");


public IEnumerable CopyAndSortElements(IEnumerable elements)

    var newElements = new List();
    // Sort XElements by Tag & name-attribute (and some other properties)
    var orderedElements = elements.OrderBy(elem => elem.Name.LocalName) // element-tag
                                  .ThenByDescending(elem => elem.Attributes("Name").Count()) // can be 0, more than 1 is invalid XML
                                  .ThenBy(elem => (elem.Attributes("Name").Any() ? elem.Attributes("Name").First().Value.ToString() : string.Empty))
                                   // in case of no Name-Attributes, try to sort by (number of) children
                                  .ThenBy(elem => elem.Elements().Count())
                                  .ThenBy(elem => elem.Attributes().Count())
                                  // next line may vary for textually different but semantically equal input when elem & attr were unordered on input, but I need to restrain myself...
                                  .ThenBy(elem => elem.ToString());
    foreach (var oldElement in orderedElements)
    
        var newElement = new XElement(oldElement.Name);
        if (oldElement.HasElements == false && string.IsNullOrEmpty(oldElement.Value) == false)
        
            // (EDMX does not have textual nodes, but SO-users may use it for other XML-types ;-) )
            // IsNullOrEmpty-check: not setting empty value keeps empty-element tag, setting value (even empty) causes start-tag immediately followed by an end-tag
            // (empty-element tags may be a matter of taste, but for textual comparison it will matter!)
            newElement.Value = oldElement.Value;
        
        var orderedAttrs = oldElement.Attributes().OrderBy(attr => attr.Name.LocalName).ThenBy(attr => attr.Value.ToString());
        newElement.Add(orderedAttrs);
        newElement.Add(CopyAndSortElements(oldElement.Elements()));
        newElements.Add(newElement);
    
    return newElements;

PD: Terminamos usando un XSLT, que alguien más escribió al mismo tiempo. Creo que encajaba más fácil/mejor en el proceso de construcción de todos. Pero tal vez/esperemos que esto sea de alguna utilidad para alguien.

valoraciones y reseñas

Si posees algún reparo y disposición de acrecentar nuestro reseña puedes escribir una referencia y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *