2010-01-18 4 views
3

J'utilise un objet C# pour sérialiser/désérialiser XML.C# XML Insérer un commentaire en XML après une balise xml

Je voudrais ajouter un commentaire au fichier XML tout sérialisation, ce commentaire sera une <!-- comment --> de base après la balise standard xml <?xml version="1.0" encoding="UTF-8"?>

Ce commentaire n'a pas besoin d'être désérialisé, son commentaire de base pour indiquer le produit et la version qui a créé le fichier xml.

+0

et votre question est? Comment ajouter ce commentaire dans le fichier XML sérialisé? – Natrium

+0

Je suis en train de sérialiser l'objet en XML, le commentaire est en dehors de la représentation de l'objet et est juste un commentaire dans le fichier XML. –

+0

Je pourrais remplacer le XMLtag par XMLtag + Comment, mais cela ne semble pas être la solution la plus élégante. –

Répondre

2

Sérialisez-le en XML, chargez ce XML comme XDocument (ou quelle que soit l'API que vous voulez), insérez le commentaire, enregistrez-le à nouveau. Simple, et devrait fonctionner avec n'importe quelle API que vous souhaitez utiliser. Vous pouvez tout faire en mémoire en utilisant un MemoryStream comme stockage temporaire.

Il peut être un moyen de sérialisation directement dans une nouvelle XDocument/XmlDocument, mais je ne suis pas au courant.

+0

@Downvoter: Vous voulez donner une raison au vote? –

10

Vous pouvez sérialiser directement dans une nouvelle XDocument en utilisant CreateWriter:

XDocument document = new XDocument(); 
document.Add(new XComment("Product XY Version 1.0.0.0")); 
using (XmlWriter writer = document.CreateWriter()) 
{ 
    serializer.WriteObject(writer, graph); 
} 
document.Save(Console.Out); 

Vous pouvez sérialisation dans une autre XmlWriter ainsi:

using (XmlWriter writer = XmlWriter.Create(Console.Out)) 
{ 
    writer.WriteStartDocument(); 
    writer.WriteComment("Product XY Version 1.0.0.0"); 
    serializer.WriteObject(writer, graph); 
    writer.WriteEndDocument(); 
} 
+2

+1000000 savait quelque chose Jon Skeet n'a pas: P (et c'est une bonne réponse) –

0

Je crois que vous pouvez mettre en œuvre IXMLSeriablizable sur vos objets . Si je me souviens bien, ReadXML (XmlReader reader) et WriteXML (XmlWriter writer) de cette interface sont appelés automatiquement lorsque la sérialisation/désérialisation (CreateSchema, ou quelle que soit la troisième méthode, n'a pas besoin d'être implémentée). L'inconvénient de l'implémenter est que vous devrez peut-être maintenant l'implémenter sur tous les objets imbriqués liés. (c'est-à-dire si vous avez un objet Department qui contient des objets User et que vous voulez le commentaire sur Departments, vous devrez implémenter IXmlSeriablizable sur Department et User). En outre, puisque vous gérez directement la sérialisation, si vous ajoutez une nouvelle propriété à une classe, vous devrez manuellement modifier les méthodes IXmlSerializable.

J'implémente typiquement IXmlSerializable sur mes objets, car j'aime avoir un contrôle direct sur ce qui est sérialisé et comment.