Comment créer un XmlDocument en utilisant XmlWriter dans .NET?

De nombreuses fonctions .NET utilisent XmlWriter pour générer / générer du fichier XML. La sortie vers un fichier / ssortingng / memory est une opération très simple:

XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere); xw.WriteStartElement("root"); ... 

Parfois, vous devez manipuler le code XML résultant et souhaitez donc le charger dans un fichier XmlDocument ou vous pourriez avoir besoin d’un XmlDocument pour une autre raison, mais vous devez générer le code XML à l’aide d’un XmlWriter. Par exemple, si vous appelez une fonction dans une bibliothèque tierce qui génère uniquement un fichier XmlWriter.

Une des choses que vous pouvez faire est d’écrire le fichier XML dans une chaîne puis de le charger dans votre document Xml:

 SsortingngWriter S = new SsortingngWriter(); XmlWriter xw = XmlWriter.Create(S); /* write away */ XmlDocument xdoc = new XmlDocument(); xdoc.LoadXml(S.ToSsortingng()); 

Toutefois, cette méthode est inefficace – vous sérialisez d’abord toutes les informations XML dans une chaîne, puis vous parsingz à nouveau la chaîne pour créer le DOM.

Comment pouvez-vous pointer un XmlWriter pour générer un XmlDocument directement?

Voici au moins une solution:

 XmlDocument doc = new XmlDocument(); using (XmlWriter writer = doc.CreateNavigator().AppendChild()) { // Do this directly  writer.WriteStartDocument();  writer.WriteStartElement("root");  writer.WriteElementSsortingng("foo", "bar");  writer.WriteEndElement();  writer.WriteEndDocument(); // or anything else you want to with writer, like calling functions etc. } 

Apparemment, XpathNavigator vous donne un XmlWriter lorsque vous appelez AppendChild ()

Les crédits vont à Martin Honnen sur: http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1

Vous pouvez faire l’inverse: XmlDocument abord XmlDocument utilisant DOM, puis écrivez-le sur un XmlWriter :

 XmlDocument xdoc = new XmlDocument(); ... // build the document SsortingngWriter S = new SsortingngWriter(); XmlWriter xw = XmlWriter.Create(S); xdoc.WriteTo(xw); 

Vous pouvez écrire un fichier XML en utilisant la classe XMLWriter. Voici un exemple pour cela.

  XmlWriterSettings objSetting = new XmlWriterSettings(); objSetting.Indent = true; objSetting.NewLineOnAtsortingbutes = true; System.Text.SsortingngBuilder sb = new System.Text.SsortingngBuilder(); using (XmlWriter objWriter = XmlWriter.Create(sb, objSetting)) { //Note the artificial, but useful, indenting objWriter.WriteStartDocument(); objWriter.WriteStartElement("books"); ////////Start Book Element/////// objWriter.WriteStartElement("book"); objWriter.WriteStartAtsortingbute("ISBN"); objWriter.WriteValue("asp1"); objWriter.WriteEndAtsortingbute(); objWriter.WriteStartElement("Title"); objWriter.WriteValue("ASP.NET"); objWriter.WriteEndElement(); objWriter.WriteElementSsortingng("ReleaseDate", "11/11/2010"); objWriter.WriteStartElement("Pages"); objWriter.WriteValue(200); objWriter.WriteEndElement(); //price objWriter.WriteEndElement(); //book ////////End Book Element/////// ////////Another Element ////////Start Book Element/////// objWriter.WriteStartElement("book"); objWriter.WriteStartAtsortingbute("ISBN"); objWriter.WriteValue("c#2"); objWriter.WriteEndAtsortingbute(); objWriter.WriteStartElement("Title"); objWriter.WriteValue("C#.NET"); objWriter.WriteEndElement(); objWriter.WriteElementSsortingng("ReleaseDate", "10/11/2010"); objWriter.WriteStartElement("Pages"); objWriter.WriteValue(500); objWriter.WriteEndElement(); objWriter.WriteEndElement(); //book ////////End Book Element/////// objWriter.WriteEndElement(); //books objWriter.WriteEndDocument(); } File.WriteAllText(Server.MapPath("BooksList.xml"), sb.ToSsortingng()); 

L’idée derrière XmlWriter est d’attendre que vous ayez fini de modifier vos données avant de commencer à écrire.

XmlWriter n’a pas été conçu pour votre situation.

Non plus

  • Attendez de connaître vos données avant d’écrire

ou

  • Faites ce que vous faites actuellement

Il y a un object Stream sous-jacent sur lequel XmlWriter écrivait, s’il était bidirectionnel (MemoryStream), vous pourriez simplement le repositionner sur -0- puis utiliser l’object Stream dans le stream XmlDocument.Load (stream).

HTH,

Z