Il dépend du scénario. XmlSerializer
est certainement une façon, et a l'avantage de la cartographie directement à un modèle d'objet. Dans .NET 3.5, XDocument
etc sont également très sympathique. Si la taille est très importante, XmlWriter
est votre ami.
Pour un XDocument
exemple:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
Ou la même chose avec XmlDocument
:
XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
Si vous êtes à la rédaction d'un grand flux de données, puis l'un des DOM approches (comme XmlDocument
/XDocument
etc) va rapidement prendre beaucoup de mémoire. Donc, si vous écrivez un 100 MO fichier xml à partir d'un fichier csv, vous pouvez envisager XmlWriter
; ce qui est plus primative (write-once "firehose"), mais très efficace (imaginez une grande boucle ici):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
Enfin, grâce à des XmlSerializer
:
[Serializable]
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
public string Nested { get; set; }
}
...
Foo foo = new Foo
{
Bar = "some & value",
Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
C'est un joli modèle de mise en correspondance de classes, etc; toutefois, il serait peut-être exagéré si vous faites quelque chose de simple (ou si le xml souhaitée n'a pas vraiment d'avoir une corrélation directe avec le modèle d'objet). Un autre problème avec XmlSerializer
, c'est qu'il n'aime pas sérialiser immuable types : tout doit avoir un public getter et setter (à moins de tout faire vous-même par la mise en œuvre de IXmlSerializable
, dans ce cas, vous n'avez pas gagné beaucoup en utilisant XmlSerializer
).