2009-09-14 13 views
9

¿Hay alguna herramienta que pueda (imprimir bastante) formatear el archivo XML, así como ordenar sus elementos y atributos?Herramienta de clasificación/formato XML

+0

duplicado: https://stackoverflow.com/q/9161934/492 .. pero aquí las respuestas eran más útiles para mí –

Respuesta

3

He encontrado este post: http://www.biglist.com/lists/xsl-list/archives/200106/msg01225.html con los siguientes elementos XSLT a XML guión y también atribuye ordenar:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:copy> 
     <!-- Sort the attributes by name. --> 
     <xsl:for-each select="@*"> 
     <xsl:sort select="name(.)"/> 
     <xsl:copy/> 
     </xsl:for-each> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()|comment()|processing-instruction()"> 
    <xsl:copy/> 
    </xsl:template> 

</xsl:stylesheet> 

no he probado todavía, pero lo más probable es que se adhieren a XSLT para hacer el formateo para mi.

+0

Esto es grande ordenar atributos xml, ¿cómo puedo también ordenar childs de una etiqueta? – Natim

7

Estaba buscando una utilidad similar y realmente no encontré lo que estaba buscando, así que apenas escribí uno. Es muy simple (y no incluye atributos en la ordenació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 por defecto es a la salida de los nodos y atributos bonita y ordenados. He aquí un ejemplo:

> type sample.xml 
<?xml version="1.0" encoding="utf-8" ?><root><node value="one" attr="name"/></root> 

> sortxml.exe sample.xml 
<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <node attr="name" value="one" /> 
</root> 
10

me gusta esta herramienta: https://xmlsorter.codeplex.com/

Usted puede ordenar por nombre de etiqueta y atributos. Me gusta usarlo antes de comparar algunos archivos XML.

XML Sorter main window

+0

Esto ni siquiera cargaría el archivo XML. Obtuvo un error de "XML no válido". No se pudo manejar la etiqueta doctype. Una vez removido, funcionó. – ScrappyDev

+0

Esto funcionó para mí para una prueba rápida de un par de archivos con más de 7K líneas y una estructura semi-compleja xml, por lo que estoy inicialmente impresionado. Sin errores en absoluto. Una descarga, lanzamiento y ejecución sin complicaciones. Una cosa a tener en cuenta es que permite "ordenar atributos" y "ordenar atributos específicos" y donde luego elige los que desea. Puede marcar ambas opciones que parecen superpuestas. –

+0

Es "Ordenar atributos" y "Ordenar * por * atributos específicos", muy diferente. El primero ordena los atributos para cada línea, el segundo ordena todas las líneas por el contenido de un atributo específico. El último es muy práctico, creo. – Gertsen

2

De la frustración con Visual Studio que parece reordenar & reescritura EDMX-archivos (Entity Framework) todo el tiempo (véase también este Uservoice), escribí algunos LINQPad-código para cambiar el orden de las cosas. Sin embargo, es fácil (y obvio) usar fuera de LinqPad.

Ordena los elementos por elemento-tipo (etiqueta), luego por el valor del atributo-elemento "Nombre", y luego por otras cosas para tratar de hacerlo más o menos determinista (xml diferente, pero el mismo significado , es [generalmente] la misma salida - vea el código).

También ordena los atributos. Tenga en cuenta que semánticamente XML-atributos pueden tener ningún orden (relevante), pero textualmente que hacen, y los sistemas de control de versiones todavía los consideran texto plano ...

(Tenga en cuenta que no fija los diferentes alias, mencionamos en Entity Framework edmx file regenerating differently amongst team)

void Main() 
{ 
    XDocument xdoc = XDocument.Load(@"\\filepath1\file1.edmx"); 

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

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

public IEnumerable<XElement> CopyAndSortElements(IEnumerable<XElement> elements) 
{ 
    var newElements = new List<XElement>(); 
    // 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); 
     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; 
} 

PS: terminamos con un XSLT, que alguien más escribió al mismo tiempo. Creo que encajaba mejor/mejor en el proceso de construcción de todos. Pero quizás/ojalá esto sea de alguna utilidad para alguien.

+0

¿Qué xslt terminaste usando? –

+0

uh, mira esto - quita los valores de los nodos como ' valor' –

0

Me encontré con este post cuando intentaba averiguar cómo ordenar y editar el archivo edmx. Mi solución fue basado en la solución de Arvo Bowens encontró https://stackoverflow.com/a/19324438/212241

void Main() 
{ 
    XDocument xdoc = XDocument.Load(@"C:\git\Nvision\Source\NvisionEntities\NvisionModel.edmx"); 
    Sort(xdoc.Root); 
    xdoc.Save(@"C:\git\Nvision\Source\NvisionEntities\NvisionModel.edmx"); 
} 

public void Sort(XElement source, bool bSortAttributes = true) 
{ 
    //Make sure there is a valid source 
    if (source == null) throw new ArgumentNullException("source"); 

    //Sort attributes if needed 
    if (bSortAttributes) 
    { 
     List<XAttribute> sortedAttributes = source.Attributes().OrderBy(a => a.ToString()).ToList(); 
     sortedAttributes.ForEach(a => a.Remove()); 
     sortedAttributes.ForEach(a => source.Add(a)); 
    } 

    //Sort the children IF any exist 
    List<XElement> sortedChildren = source.Elements().OrderBy(elem => elem.Attributes("Name").Any() ? elem.Attributes("Name").First().Value.ToString() : string.Empty).ToList(); 
    if (source.HasElements) 
    { 
     source.RemoveNodes(); 
     sortedChildren.ForEach(c => Sort(c)); 
     sortedChildren.ForEach(c => source.Add(c)); 
    } 
} 
Cuestiones relacionadas