Voici ce que j'utilise:
using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
namespace Utils
{
public class XMLSerializer
{
public static Byte[] StringToUTF8ByteArray(String xmlString)
{
return new UTF8Encoding().GetBytes(xmlString);
}
public static String SerializeToXML<T>(T objectToSerialize)
{
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings =
new XmlWriterSettings {Encoding = Encoding.UTF8, Indent = true};
using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings))
{
if (xmlWriter != null)
{
new XmlSerializer(typeof(T)).Serialize(xmlWriter, objectToSerialize);
}
}
return sb.ToString();
}
public static void DeserializeFromXML<T>(string xmlString, out T deserializedObject) where T : class
{
XmlSerializer xs = new XmlSerializer(typeof (T));
using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString)))
{
deserializedObject = xs.Deserialize(memoryStream) as T;
}
}
}
}
Ensuite il suffit d'appeler:
string xml = Utils.SerializeToXML(myObjectsIEnumerable);
Je ne l'ai pas essayé, par exemple, un IEnumerable
qui va chercher des objets un à un temps à distance, ou tout autre cas d'utilisation étrange, mais il fonctionne parfaitement pour List<T>
et d'autres collections qui sont en mémoire.
EDIT: Sur la base de vos commentaires en réponse à cela, vous pouvez utiliser XmlDocument.LoadXml
pour charger la chaîne XML résultant en un XmlDocument
, sauf le premier à un fichier, et l'utiliser comme fichier XML maître. Pour chaque élément dans le IEnumerable
, utilisez à nouveau LoadXml
pour créer un nouveau XmlDocument
en mémoire, saisissez les nœuds souhaités, ajoutez-les au document maître et enregistrez-le à nouveau, en vous débarrassant du nouveau. Une fois que vous avez terminé, il peut y avoir un moyen d'envelopper tous les nœuds dans votre balise racine. Vous pouvez également utiliser XSL et XslCompiledTransform
pour écrire un autre fichier XML avec les objets correctement enveloppés dans la balise racine.
Voir http://www.hanselman.com/blog/MixingXmlSerializersWithXElementsAndLINQToXML.aspx – bajafresh4life