2011-10-22 9 views
7

Mi entrada es como como el soplaron xml:Ordenación de atributos de XML

<Phrase Entry="ID"> 
<Ans number="1"> 
    <Identification LastName="Bornery" Name="John" Age="23"/> 
</Ans> 
</Phrase> 

y quiero ordenar la atributos XML en la base en su primer fin de caracteres Nombres por Arrangment alfabético, como el XML sopló:

<Phrase Entry="ID"> 
<Ans number="1"> 
    <Identification Age="23" LastName="Bornery" Name="John" /> 
</Ans> 
</Phrase> 

gracias.

+2

'LastName' no es atributo. Es un nombre de elemento. Su XML tiene una sintaxis incorrecta. –

+0

Oh sí, gracias por tu notación. – SMD

+2

¿Por qué quieres hacer esto? La orden del atributo no es importante para cualquier analizador compatible ... –

Respuesta

9

Su salida XML está mal, pero si la entrada fue de esta manera:

<Phrase Entry="ID"> 
<Ans number="1"> 
    <Blah LastName="Bornery" Name="John" Age="23"/> 
</Ans> 
</Phrase> 

A continuación, el siguiente código

static string SortAttributes(string xml) 
{ 
    var doc = XDocument.Parse(xml); 
    foreach (XElement element in doc.Descendants()) 
    { 
     var attrs = element.Attributes().ToList(); 
     attrs.Remove(); 
     attrs.Sort((a, b) => a.Name.LocalName.CompareTo(b.Name.LocalName)); 
     element.Add(attrs); 
    } 
    xml = doc.ToString(); 
    return xml; 
} 

volverá este

<Phrase Entry="ID"> 
    <Ans number="1"> 
    <Blah Age="23" LastName="Bornery" Name="John" /> 
    </Ans> 
</Phrase> 
0

Si desea comparar dos Documentos XML como cadenas, debe convertirlos en XML canónico. Esto implica mucho más que obtener los atributos en un orden canónico: implica, por ejemplo, normalizar espacios en blanco y quizás prefijos de espacios de nombres. Busque una utilidad de canonicalización de XML.

Cuestiones relacionadas