Comment puis-je renommer les noms de classe via des attributs Xml?
Supposons que j'ai un XML-classe sérialisable appelé Chanson:
[Serializable]
class Song
{
public string Artist;
public string SongTitle;
}
Afin d'économiser de l'espace (et aussi semi-obscur le fichier XML), je décide de renommer les éléments xml:
[XmlRoot("g")]
class Song
{
[XmlElement("a")]
public string Artist;
[XmlElement("s")]
public string SongTitle;
}
Ceci va produire une sortie XML comme ceci:
<Song>
<a>Britney Spears</a>
<s>I Did It Again</s>
</Song>
Je veux renommer/reconfigurer le nom de la classe/objet. Dire, dans l'exemple ci-dessus, je souhaite renommer la classe Chanson à g. Afin que le xml résultant devrait ressembler à ceci:
<g>
<a>Britney Spears</a>
<s>I Did It Again</s>
</g>
Est-il possible de renommer les noms de classe via xml-attributs?
Je ne souhaite pas créer/parcourir le DOM manuellement, donc je me demandais si il pourrait être réalisé par un décorateur.
Merci d'avance!
Mise à JOUR: Oups! Cette fois, j'ai vraiment did it again!
J'ai oublié de mentionner - en fait, je suis sérialisation d'une liste d'objets de la Chanson dans le XML.
Voici le code de sérialisation:
public static bool SaveSongs(List<Song> songs)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
using (TextWriter textWriter = new StreamWriter("filename"))
{
serializer.Serialize(textWriter, songs);
}
}
Et voici le XML de sortie:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSong>
<Song>
<a>Britney Spears</a>
<s>Oops! I Did It Again</s>
</Song>
<Song>
<a>Rihanna</a>
<s>A Girl Like Me</s>
</Song>
</ArrayOfSong>
Apparemment, le XmlRoot() attribut ne pas renommer l'objet dans un contexte de liste.
Suis-je raté quelque chose?
- Je pense qu'il y a une erreur dans le fichier XML. "I did it again" n'est pas le titre exact de la chanson. Le titre exact est: "Oops!...I Did It Again". (Juste pour prévenir de futures frustrations avec les validateurs)
- Pour info,
[Serializable]
n'est pas question pour la Sérialisation XML. - Voir ma réponse à jour basé sur vos éclaircissements.
- Il y a quelques années, il pourrait donc être l'élément à mettre à jour la bonne réponse 🙂 La réponse actuellement marquée comme étant correcte est en fait incorrect de la question posée (et n'a pas pour conséquence la sortie désirée).
XmlTypeAttribute
et sesTypeName
propriété est la façon correcte de le faire (voir ci-dessous). - Popovsky: Si vous cochez les modifications, même la toute première version de la question n'aurait pas travaillé avec
XmlRoot
. L'OP n'a pas été ici depuis 2 ans, donc il va continuer à induire en erreur les codeurs de partout 🙂
Vous devez vous connecter pour publier un commentaire.
La caisse de la XmlRoot attribut.
Documentation peut être trouvée ici:
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute(v=VS.90).aspx
Mise à JOUR:
Juste essayé et il fonctionne parfaitement sur VS 2008.
Ce code:
Sorties:
<sgr><sgs><g a="A1" s="S1" /><g a="A2" s="S2"><sgs><sgr>
XmlArrayItem("g")
est ce que je cherchaisSolution: Utilisez [XmlType(TypeName="g")]
XmlRoot ne fonctionne qu'avec XML racine nœuds que par la documentation (et ce que vous attendez, donné son nom comprend racine)!
Je n'ai pu obtenir aucune des autres réponses à travailler de sorte gardé creuser...
Au lieu de cela, j'ai trouvé que le XmlTypeAttribute (c'est à dire
[XmlType]
) et de ses TypeName bien faire un travail similaire pour non-root classes/objets.par exemple
En supposant que vous appliquer pour les autres classes, par exemple:
Ce sera la sortie de la suite de exactement comme requis dans la question:
J'ai utilisé dans plusieurs projets de production et n'a trouvé aucun problème avec elle.
XmlType
décrit ici. Veuillez poser une nouvelle question si vous en avez un 🙂Si c'est l'élément racine du document, vous pouvez utiliser [XmlRoot("g")].
Voici ma mise à jour en fonction de vos éclaircissements. Le degré de contrôle que vous demandez n'est pas possible sans un emballage de classe. Cet exemple utilise un
SongGroup
classe pour envelopper la liste, de sorte que vous pouvez donner d'autres noms pour les éléments à l'intérieur.Cela a aussi pour effet de générer une plus intérieure de l'élément représentant la liste elle-même. Sur mon système, la sortie ressemble à ceci:
XmlType(TypeName="g")]
. Vous n'avez pas besoin d'un emballage classe et peut attribuer les classes elles-mêmes. Des acclamations.Devrait faire l'affaire
Utilisation XmlElementAttribute: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspx
devrait fonctionner.