451 votes

Quel est le meilleur moyen de générer du code XML en C #?

Veuillez indiquer vos meilleures pratiques pour la construction de XML en utilisant C #.

Modifier:

Avec l'aide de Shog9 , je viens d'apprendre à propos de la fonctionnalité "wiki de la communauté" et l'ai allumé avec bonheur.

Si vous aimez une réponse particulière, votez. Si vous n'aimez pas une réponse particulière, n'hésitez pas à serrer violemment votre poing dans les airs et à voter contre.

519voto

Marc Gravell Points 482669

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).

24voto

Vincent Points 1
new XElement("Foo",
       from s in nameValuePairList
       select
             new XElement("Bar",
                  new XAttribute("SomeAttr", "SomeAttrValue"),
                          new XElement("Name", s.Name),
                          new XElement("Value", s.Value)
                         )
            );

21voto

Chad Moran Points 8560

Je donnerais XLINQ (lire : LINQ to XML) un essai. Il est facile, intuitif et est facilement modifiable.

9voto

Rob Walker Points 25840

Consultez également XmlDocument interface fluent, qui vraiment fournit facile à type/lecture de sortie XML de Mark S. Rasmussen.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X