7
votes

Élément racine manquant - Création de xmldocument à l'aide de xmltextwriter

J'ai le code suivant qui crie «élément racine manquant» pendant doc.harload () code>.

MemoryStream stream = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8);
xmlWriter.Formatting = System.Xml.Formatting.Indented;
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("Root");
XmlDocument doc = new XmlDocument();
stream.Position = 0;
doc.Load(stream);
xmlWriter.Close();


1 commentaires

(Quelque chose de sans rapport: Bien que ce ne soit pas strictement nécessaire, vous pouvez envelopper le code dans en utilisant des blocs pour votre MemoryStream et xmltextwriter objets - ils sont les deux idisposables .)


3 Réponses :


13
votes

Vous n'avez pas rougé le xmlwriter code>, il est donc possible de ne rien avoir encore écrit. De plus, vous ne remplissez jamais l'élément racine, alors même s'il a em> écrit xxx pré>

il n'aura pas écrit la balise de fermeture. Vous essayez de le charger comme un document complet em>. P>

Je ne suis pas sûr de quel point un xmlwriter réellement em> écrit la partie de départ de En tout cas, n'oubliez pas que cela peut avoir des attributs à écrire aussi. Le plus il pourrait écrire avec le code que vous avez est . P>

Voici un programme complet qui fonctionne: p>

using System;
using System.IO;
using System.Text;
using System.Xml;

class Test
{
    static void Main(string[] args)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8);
            xmlWriter.Formatting = System.Xml.Formatting.Indented;
            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("Root");
            xmlWriter.WriteEndElement();
            xmlWriter.Flush();

            XmlDocument doc = new XmlDocument();
            stream.Position = 0;
            doc.Load(stream);
            doc.Save(Console.Out);
        }
    }
}


2 commentaires

POINT DE L'ORDRE: Est-ce que .Close () n'est généralement pas plus correct que .FUSH ()?


@annalata: Je suppose que cela fermerait le flux, que nous ne voulons pas faire ici. Habituellement, je voudrais juste disposer l'écrivain cependant.



0
votes

Qu'est-ce que @Skeet a dit, plus, vous ne semblez pas fermer votre élément:

xmlWriter.WriteEndElement();


2 commentaires

J'ai couvert que dans ma deuxième phrase :)


En effet, vous l'avez fait, mais dans mode furtif - c'est la seule raison pour laquelle je pourrais comprendre pourquoi je l'aurais manqué. :)



0
votes

Eh bien, je vois que vous commencez le document, mais je ne vous vois pas Mettre fin à It ou Fermeture It ... (du moins pas avant de l'utiliser)


0 commentaires