47 votes

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

Beaucoup de .NET des fonctions utilisation XmlWriter de sortie/générer le xml. De la sortie à un fichier/cordes/type de mémoire est très fonctionnement:

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

Parfois , vous avez besoin de manipuler le Xml résultant et voudrais donc de le charger dans un XmlDocument ou peut-être besoin d'un XmlDocument pour une autre raison, mais vous devez générer le XML à l'aide d'un XmlWriter. Par exemple, si vous appelez une fonction dans une 3e partie de la bibliothèque des sorties à un XmlWriter seulement.

Une des choses que vous pouvez faire est d'écrire le code xml à une chaîne, puis le charger dans votre XmlDocument:

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

Cependant, c'est inefficace, tout d'abord vous sérialiser tous les xml info en chaîne de caractères, alors vous analyser la chaîne de nouveau pour créer les DOM.

Comment pouvez-vous point un XmlWriter de construire un XmlDocument directement?

82voto

Boaz Points 5196

Voici au moins une solution:

 XmlDocument doc = new XmlDocument(); 
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) 
{ 
    // Do this directly 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("root"); 
     writer.WriteElementString("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 sont envoyés à Martin Honnen à l'adresse suivante: http://groups.google.com/group/microsoft.public.dotnet.xml/browse%5Fthread/thread/24e4c8d249ad8299?pli=1

9voto

Thomas Levesque Points 141081

Vous pouvez faire le contraire: construisez le XmlDocument abord en utilisant DOM, puis écrivez-le dans un XmlWriter :

 XmlDocument xdoc = new XmlDocument();
... // build the document

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
 

7voto

Jayesh Sorathia Points 832

Vous pouvez écrire un fichier XML à l'aide de la classe XMLWriter. Voici un exemple pour cela.

     XmlWriterSettings objSetting = new XmlWriterSettings();
    objSetting.Indent = true;
    objSetting.NewLineOnAttributes = true;

    System.Text.StringBuilder sb = new System.Text.StringBuilder();


    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.WriteStartAttribute("ISBN");
        objWriter.WriteValue("asp1");
        objWriter.WriteEndAttribute();

        objWriter.WriteStartElement("Title");
        objWriter.WriteValue("ASP.NET");
        objWriter.WriteEndElement();

        objWriter.WriteElementString("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.WriteStartAttribute("ISBN");
        objWriter.WriteValue("c#2");
        objWriter.WriteEndAttribute();

        objWriter.WriteStartElement("Title");
        objWriter.WriteValue("C#.NET");
        objWriter.WriteEndElement();

        objWriter.WriteElementString("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.ToString());
 

4voto

Binary Worrier Points 27424

L'idée derrière XmlWriter est d'attendre d'avoir fini de modifier vos données avant de commencer à écrire.

XmlWriter n'a pas été construit en tenant compte de votre situation.

Non plus

  • Attendez de savoir quelles seront vos données avant d'écrire

ou

  • Faites ce que vous faites actuellement

1voto

Zach Bonham Points 4460

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

HTH,

Z

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