2010-07-14 2 views
7

Je rencontre le code suivant qui crache «Elément racine manquant» pendant doc.Load().Élément racine manquant - Création de Xmldocument à l'aide de XmlTextWriter

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(); 

Je ne parviens pas à résoudre le problème. Des idées?

+2

(Quelque chose de non connexe: Bien que ce ne soit pas strictement nécessaire, vous pouvez envelopper le code dans des blocs 'using' pour vos objets' MemoryStream' et 'XmlTextWriter' - ils sont tous les deux 'IDisposable'.) – stakx

Répondre

13

Vous n'avez pas vidé le xmlWriter, il est donc possible qu'il n'ait rien écrit pour l'instant. , Vous aussi jamais terminé l'élément racine, même si elle a écrit sur

<Root> 

il pas écrit la balise de fermeture. Vous essayez de le charger en tant que document complet .

Je ne sais pas à quel point un XmlWriter effectivement écrit de toute façon la partie de départ d'un élément - n'oubliez pas qu'il peut aussi avoir des attributs à écrire. Le maximum qu'il pourrait écrire avec le code que vous avez est <Root.

Voici un programme complet qui fonctionne: (. Notez que je ne suis pas appeler WriteEndDocument - qui semble seulement être nécessaire si vous avez encore des éléments ouverts ou attributs)

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); 
     } 
    } 
} 

+0

Point d'ordre: est .Close() pas d'habitude plus correct que .Flush()? – annakata

+0

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

0

Qu'est-ce que @ dit au pigeon d'argile, plus, vous ne semblez pas fermer votre élément:

xmlWriter.WriteEndElement(); 
+0

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

+0

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

0

Eh bien, je vois que vous commencer le document, mais je ne vous vois pas ending ou closing il ... (au moins avant de l'utiliser)

Questions connexes