Вот что я использую:
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;
}
}
}
}
Тогда просто позвоните:
string xml = Utils.SerializeToXML(myObjectsIEnumerable);
Я не пробовал, например, с IEnumerable
, который извлекает объекты по одному за раз, или с любыми другими странными случаями использования, но он отлично работает для List<T>
и других коллекций, находящихся в памяти.
EDIT : Исходя из ваших комментариев в ответ на это, вы можете использовать XmlDocument.LoadXml
, чтобы загрузить результирующую строку XML в XmlDocument
, сохранить первую в файл и использовать ее как ваш основной файл XML. Для каждого элемента в IEnumerable
, снова используйте LoadXml
, чтобы создать новый в памяти XmlDocument
, захватить нужные вам узлы, добавить их в главный документ и снова сохранить, избавившись от нового.
После того, как вы закончите, может быть способ обернуть все узлы в вашем корневом теге. Вы также можете использовать XSL и XslCompiledTransform
для записи другого XML-файла с объектами, правильно обернутыми в корневой тег.