2009-12-08 2 views
6

Ho un'istanza XElement e desidero scrivere su uno stream utilizzando la classe XmlWriter. Perché? Bene, una delle impostazioni di configurazione definisce se utilizzare Xml binario o meno. In base a questa impostazione, viene creata un'istanza XmlWriter idonea, tramite XmlWriter.Create(stream) o XmlDictionaryWriter.CreateBinaryWriter(stream)).Come scrivere System.Xml.Linq.XElement utilizzando XmlWriter su uno stream

Comunque, sto cercando il seguente codice, ma lascia il flusso vuoto:

using (var stream = new MemoryStream()) 
{ 
    var xmlReader = new XDocument(xml).CreateReader(); 
    xmlReader.MoveToContent(); 
    var xmlWriter = GetXmlWriter(stream); 
    xmlWriter.WriteNode(xmlReader, true); 
    return stream.ToArray(); 
} 

Ho controllato, xmlReader siano correttamente allineati dopo MoveToContent presso l'elemento principale XML.

Devo fare qualcosa di sbagliato, ma cosa?

Grazie.

risposta

10

Non hai mostrato cosa fa GetXmlWriter ... ma hai provato a lavare lo scrittore?

xmlWriter.Flush(); 

In alternativa, avvolgere il XmlWriter in un altro using dichiarazione:

using (var stream = new MemoryStream()) 
{ 
    var xmlReader = new XDocument(xml).CreateReader(); 
    xmlReader.MoveToContent(); 
    using (var xmlWriter = GetXmlWriter(stream)) 
    { 
     xmlWriter.WriteNode(xmlReader, true); 
    } 
    return stream.ToArray(); 
} 

si potrebbe desiderare di fare lo stesso per la XmlReader pure, anche se in questo caso particolare, io non ti credo particolarmente bisogno a.

Detto questo, non sono del tutto sicuro del motivo per cui stai utilizzando uno XmlReader. Qualche ragione per cui non puoi trovare lo XElement e usare XElement.WriteTo(XmlWriter)? O se stai cercando di copiare l'intero documento, usa solo XDocument.WriteTo(XmlWriter)

+0

Ecco fatto. Non ho scaricato lo scrittore. Grazie. – mark

+0

BTW, Grazie per il commento, cambierò la mia implementazione di conseguenza. – mark