Comment puis-je renommer les noms de classe via les atsortingbuts Xml?

Supposons que je dispose d’une classe XML-sérialisable appelée Song :

[Serializable] class Song { public ssortingng Artist; public ssortingng SongTitle; } 

Afin de gagner de la place (et aussi de semi-masquer le fichier XML), je décide de renommer les éléments xml:

 [XmlRoot("g")] class Song { [XmlElement("a")] public ssortingng Artist; [XmlElement("s")] public ssortingng SongTitle; } 

Cela produira une sortie XML comme ceci:

  Britney Spears I Did It Again  

Je veux aussi renommer / remapper le nom de la classe / object. Disons que dans l’exemple ci-dessus, je souhaite renommer la classe Song en g . Pour que le xml résultant ressemble à ceci:

  Britney Spears I Did It Again  

Est-il possible de renommer les noms de classes via xml-atsortingbutes ?

Je ne souhaite pas créer / traverser le DOM manuellement, alors je me demandais si cela pouvait être réalisé via un décorateur.

Merci d’avance!

MISE À JOUR: Oups! Cette fois je l’ai vraiment fait à nouveau! J’ai oublié de mentionner – Je sérialise en fait une liste d’objects Song dans le XML.

Voici le code de sérialisation:

  public static bool SaveSongs(List songs) { XmlSerializer serializer = new XmlSerializer(typeof(List)); using (TextWriter textWriter = new StreamWriter("filename")) { serializer.Serialize(textWriter, songs); } } 

Et voici la sortie XML:

    Britney Spears Oops! I Did It Again   Rihanna A Girl Like Me   

Apparemment, l’ atsortingbut XmlRoot () ne renomme pas l’object dans un contexte de liste.

Est-ce que je manque quelque chose?

Extraire l’atsortingbut XmlRoot.

La documentation peut être trouvée ici: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootatsortingbute(v=VS.90).aspx

 [XmlRoot(Namespace = "www.contoso.com", ElementName = "MyGroupName", DataType = "ssortingng", IsNullable=true)] public class Group 

UPDATE: Juste essayé et cela fonctionne parfaitement sur VS 2008. Ce code:

 [XmlRoot(ElementName = "sgr")] public class SongGroup { public SongGroup() { this.Songs = new List(); } [XmlElement(ElementName = "sgs")] public List Songs { get; set; } } [XmlRoot(ElementName = "g")] public class Song { [XmlElement("a")] public ssortingng Artist { get; set; } [XmlElement("s")] public ssortingng SongTitle { get; set; } } 

Les sorties:

    A1 S1   A2 S2   

Solution: Utilisez [XmlType (TypeName = “g”)]

XmlRoot ne fonctionne qu’avec les nœuds racine XML conformément à la documentation (et ce à quoi vous vous attendez, étant donné que son nom inclut root )!

Je n’ai pu obtenir aucune des autres réponses au travail alors j’ai continué à creuser …

Au lieu de cela, j’ai trouvé que le XmlTypeAtsortingbute (c’est-à-dire [XmlType] ) et sa propriété TypeName font un travail similaire pour les classes / objects non-root .

par exemple

 [XmlType(TypeName="g")] class Song { public ssortingng Artist; public ssortingng SongTitle; } 

En supposant que vous l’appliquez aux autres classes, par exemple:

 [XmlType(TypeName="a")] class Artist { ..... } [XmlType(TypeName="s")] class SongTitle { ..... } 

Cela affichera les informations suivantes exactement comme requirejs dans la question :

  Britney Spears I Did It Again  

Je l’ai utilisé dans plusieurs projets de production et je n’ai trouvé aucun problème.

S’il s’agit de l’élément racine du document, vous pouvez utiliser [XmlRoot (“g”)] .


Voici ma réponse mise à jour en fonction de vos éclaircissements. Le degré de contrôle que vous demandez n’est pas possible sans une classe d’emballage. Cet exemple utilise une classe SongGroup pour envelopper la liste afin de pouvoir donner des noms alternatifs aux éléments qu’elle SongGroup .

 using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; public class SongGroup { public SongGroup() { this.Songs = new List(); } [XmlArrayItem("g", typeof(Song))] public List Songs { get; set; } } public class Song { public Song() { } [XmlElement("a")] public ssortingng Artist { get; set; } [XmlElement("s")] public ssortingng SongTitle { get; set; } } internal class Test { private static void Main() { XmlSerializer serializer = new XmlSerializer(typeof(SongGroup)); SongGroup group = new SongGroup(); group.Songs.Add(new Song() { Artist = "A1", SongTitle = "S1" }); group.Songs.Add(new Song() { Artist = "A2", SongTitle = "S2" }); using (Stream stream = new MemoryStream()) using (StreamWriter writer = new StreamWriter(stream)) { serializer.Serialize(writer, group); stream.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(stream)) { Console.WriteLine(reader.ReadToEnd()); } } } } 

Cela a pour effet secondaire de générer un autre élément interne représentant la liste elle-même. Sur mon système, la sortie ressemble à ceci:

     A1 S1   A2 S2    
 [XmlRoot("g")] class Song { } 

Devrait faire le tour

Utilisez XmlElementAtsortingbute: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootatsortingbute.aspx

 [Serializable] [XmlRoot(ElementName="g")] class Song { public ssortingng Artist; public ssortingng SongTitle; } 

devrait marcher.