2010-07-14 33 views
7

Tengo el siguiente código que está escupiendo 'Root Element Missing' durante doc.Load().Falta el elemento raíz - Creación de XmlDocument utilizando 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(); 

No consigo resolver el problema. ¿Alguna idea?

+2

(Algo no relacionado: Aunque no es estrictamente necesario, puede envolver el código en bloques 'using' para sus objetos' MemoryStream' y 'XmlTextWriter' - ambos son 'IDisposable'.) – stakx

Respuesta

13

No ha enjuagado el xmlWriter, por lo que bien puede no haber escrito nada todavía. Además, nunca se completando el elemento raíz, por lo que incluso si tiene escrita cabo

<Root> 

no va a haber escrito la etiqueta de cierre. Está intentando cargarlo como un documento completo .

No estoy seguro en qué punto un XmlWriter realmente escribe la parte inicial de un elemento de todos modos, no olvide que puede tener atributos para escribir también. Lo máximo que podría escribir con el código que tienes es <Root.

Aquí es un completo programa que funciona: (. Tenga en cuenta que no estoy llamando WriteEndDocument - que sólo parece ser necesaria si todavía tiene elementos abiertos o atributos)

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

Punto de orden: es .Close() no suele ser más correcto que .Flush()? – annakata

+0

@annalata: Supongo que cerraría la transmisión, lo que no queremos hacer aquí. Por lo general, me gustaría disponer del escritor. –

0

Qué @ skeet dijo, además, que no parecen cerrar su elemento:

xmlWriter.WriteEndElement(); 
+0

Cubrí eso en mi segunda oración :) –

+0

De hecho lo hizo, pero en * modo sigiloso * - esa es la única razón por la que pude comprender por qué me lo habría perdido. :) – Robaticus

0

Bien veo que a partir del documento, pero yo no te veo ending o closing ... (al menos no antes de usarlo)

Cuestiones relacionadas