Comment puis-je créer du XML en C #?

Comment puis-je générer du code XML valide en C #?

Cela dépend du scénario. XmlSerializer est certainement à sens unique et présente l’avantage d’être directement associé à un modèle d’object. Dans .NET 3.5, XDocument , etc. sont également très conviviaux. Si la taille est très grande, XmlWriter est votre ami.

Pour un exemple XDocument :

 Console.WriteLine( new XElement("Foo", new XAtsortingbute("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.SetAtsortingbute("Bar", "some & value"); el.AppendChild(doc.CreateElement("Nested")).InnerText = "data"; Console.WriteLine(doc.OuterXml); 

Si vous écrivez un grand stream de données, toutes les approches DOM (telles que XmlDocument / XDocument , etc.) prendront rapidement beaucoup de mémoire. Donc, si vous écrivez un fichier XML de 100 Mo à partir de CSV , vous pouvez envisager XmlWriter ; c’est plus primitif (une écriture firehose), mais très efficace (imaginez une grosse boucle ici):

 XmlWriter writer = XmlWriter.Create(Console.Out); writer.WriteStartElement("Foo"); writer.WriteAtsortingbuteSsortingng("Bar", "Some & value"); writer.WriteElementSsortingng("Nested", "data"); writer.WriteEndElement(); 

Enfin, via XmlSerializer :

 [Serializable] public class Foo { [XmlAtsortingbute] public ssortingng Bar { get; set; } public ssortingng Nested { get; set; } } ... Foo foo = new Foo { Bar = "some & value", Nested = "data" }; new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo); 

Ceci est un bon modèle pour la cartographie des classes, etc. Cependant, cela peut être exagéré si vous faites quelque chose de simple (ou si le XML souhaité n’a pas vraiment de corrélation directe avec le modèle d’object). Un autre problème avec XmlSerializer est qu’il n’aime pas sérialiser les types immuables: tout doit avoir un getter et un setter publics (sauf si vous faites tout vous-même en implémentant IXmlSerializable , auquel cas vous n’avez pas beaucoup gagné avec XmlSerializer ).

La meilleure chose que j’ai essayée est LINQ to XSD (qui est inconnu de la plupart des développeurs). Vous lui donnez un schéma XSD et il génère en arrière-plan un modèle d’object complet parfaitement typé (basé sur LINQ to XML), qui est très facile à utiliser – et il met à jour et valide votre modèle d’object et votre code XML. temps réél. Bien qu’il soit toujours “Aperçu”, je n’ai pas rencontré de bugs.

Si vous avez un schéma XSD qui ressemble à ceci:

            

Ensuite, vous pouvez simplement créer du XML comme ceci:

 RootElement rootElement = new RootElement; rootElement.Element1 = "Element1"; rootElement.Element2 = "Element2"; rootElement.Atsortingbute1 = 5; rootElement.Atsortingbute2 = true; 

Ou simplement charger un fichier XML à partir d’un fichier comme celui-ci:

 RootElement rootElement = RootElement.Load(filePath); 

Ou enregistrez-le comme ceci:

 rootElement.Save(ssortingng); rootElement.Save(textWriter); rootElement.Save(xmlWriter); 

rootElement.Untyped fournit également l’élément sous la forme d’un XElement (de LINQ à XML).

 new XElement("Foo", from s in nameValuePairList select new XElement("Bar", new XAtsortingbute("SomeAttr", "SomeAttrValue"), new XElement("Name", s.Name), new XElement("Value", s.Value) ) ); 

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

Exemple: lecture et écriture de XML à l’aide de XLinq

Consultez également l’ interface fluide XmlDocument de Mark S. Rasmussen, qui fournit une sortie XML facile à saisir / lire.

XmlWriter est le moyen le plus rapide d’écrire un bon XML. XDocument, XMLDocument et quelques autres fonctionnent également, mais ne sont pas optimisés pour l’écriture de XML. Si vous voulez écrire le XML aussi vite que possible, vous devez absolument utiliser XmlWriter.

Dans le passé, j’ai créé mon schéma XML, puis utilisé un outil pour générer des classes C # qui sérialiseront vers ce schéma. L’outil de définition de schéma XML est un exemple

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

Je pense que cette ressource devrait suffire à un enregistrement / chargement XML modéré: lecture / écriture XML en utilisant C # .

Ma tâche était de stocker la notation musicale. Je choisis XML, car je suppose que .NET a suffisamment évolué pour permettre une solution facile à la tâche. J’avais raison 🙂

Ceci est mon prototype de fichier de chanson:

        

Cela peut être résolu assez facilement:

Pour enregistrer dans un fichier:

  private void saveToolSsortingpMenuItem_Click(object sender, EventArgs e) { saveFileDialog1.Title = "Save Song File"; saveFileDialog1.Filter = "Song Files|*.xsong"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create); XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8); w.WriteStartDocument(); w.WriteStartElement("music"); w.WriteAtsortingbuteSsortingng("judul", Program.music.getTitle()); w.WriteAtsortingbuteSsortingng("pengarang", Program.music.getAuthor()); w.WriteAtsortingbuteSsortingng("tempo", Program.music.getTempo()+""); w.WriteAtsortingbuteSsortingng("birama", Program.music.getBirama()); w.WriteAtsortingbuteSsortingng("nadadasar", Program.music.getNadaDasar()); w.WriteAtsortingbuteSsortingng("biramapembilang", Program.music.getBiramaPembilang()+""); w.WriteAtsortingbuteSsortingng("biramapenyebut", Program.music.getBiramaPenyebut()+""); for (int i = 0; i < listNotasi.Count; i++) { CNot not = listNotasi[i]; w.WriteStartElement("not"); w.WriteAttributeString("angka", not.getNot() + ""); w.WriteAttributeString("oktaf", not.getOktaf() + ""); String naikturun=""; if(not.isTurunSetengah())naikturun="\\"; else if(not.isNaikSetengah())naikturun="/"; w.WriteAttributeString("naikturun",naikturun); w.WriteAttributeString("nilai", not.getNilaiNot()+""); w.WriteEndElement(); } w.WriteEndElement(); w.Flush(); fs.Close(); } } 

Pour le fichier de chargement:

 openFileDialog1.Title = "Open Song File"; openFileDialog1.Filter = "Song Files|*.xsong"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open); XmlTextReader r = new XmlTextReader(fs); while (r.Read()) { if (r.NodeType == XmlNodeType.Element) { if (r.Name.ToLower().Equals("music")) { Program.music = new CMusic(r.GetAtsortingbute("judul"), r.GetAtsortingbute("pengarang"), r.GetAtsortingbute("birama"), Convert.ToInt32(r.GetAtsortingbute("tempo")), r.GetAtsortingbute("nadadasar"), Convert.ToInt32(r.GetAtsortingbute("biramapembilang")), Convert.ToInt32(r.GetAtsortingbute("biramapenyebut"))); } else if (r.Name.ToLower().Equals("not")) { CNot not = new CNot(Convert.ToInt32(r.GetAtsortingbute("angka")), Convert.ToInt32(r.GetAtsortingbute("oktaf"))); if (r.GetAtsortingbute("naikturun").Equals("/")) { not.setNaikSetengah(); } else if (r.GetAtsortingbute("naikturun").Equals("\\")) { not.setTurunSetengah(); } not.setNilaiNot(Convert.ToSingle(r.GetAtsortingbute("nilai"))); listNotasi.Add(not); } } else if (r.NodeType == XmlNodeType.Text) { Console.WriteLine("\tVALUE: " + r.Value); } } } } } 

Pour les choses simples, j’utilise juste les classes XmlDocument / XmlNode / XmlAtsortingbute et XmlDocument DOM trouvées dans System.XML.

Il génère le XML pour moi, je dois juste lier quelques éléments ensemble.

Cependant, sur les choses plus importantes, j’utilise la sérialisation XML.

Pour des cas simples, je suggérerais également de regarder XmlOutput comme une interface fluide pour créer du XML.

XmlOutput est idéal pour la création Xml simple avec du code lisible et maintenable, tout en générant du XML valide. La publication originale a quelques bons exemples.

Comme ci-dessus

J’utilise ssortingngbuilder.append ().

Très simple, vous pouvez ensuite faire xmldocument.load (object ssortingnbuilder en paramètre).

Vous vous trouverez probablement en utilisant ssortingng.concat dans le paramètre append, mais c’est une approche très simple.