2009-12-08 7 views
6

J'ai une instance XElement et je souhaite écrire dans un flux en utilisant la classe XmlWriter. Pourquoi? Eh bien, l'un des paramètres de configuration définit s'il faut utiliser Xml binaire ou non. Sur la base de ce paramètre, une instance XmlWriter appropriée est créée - soit par XmlWriter.Create(stream) ou XmlDictionaryWriter.CreateBinaryWriter(stream)).Comment écrire System.Xml.Linq.XElement en utilisant XmlWriter dans un flux

Quoi qu'il en soit, je suis en train le code suivant, mais il laisse le flux vide:

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

J'ai vérifié, xmlReader est correctement aligné après MoveToContent à l'élément XML racine.

Je dois faire quelque chose de mal, mais quoi?

Merci.

Répondre

10

Vous n'avez pas montré ce que fait GetXmlWriter ... mais avez-vous essayé de vider le programme?

xmlWriter.Flush(); 

Sinon, envelopper le XmlWriter dans une autre déclaration using:

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

Vous pouvez faire la même chose pour le XmlReader ainsi, bien que dans ce cas particulier, je ne crois pas que vous avez besoin en particulier à. Cela dit, je ne suis pas tout à fait sûr pourquoi vous utilisez un XmlReader du tout. Une raison pour laquelle vous ne pouvez pas simplement trouver le XElement et utiliser XElement.WriteTo(XmlWriter)? Ou si vous essayez de copier le document entier, utilisez simplement XDocument.WriteTo(XmlWriter)

+0

C'est tout. Je n'ai pas vidé l'écrivain. Merci. – mark

+0

BTW, Merci pour le commentaire, je vais modifier ma mise en œuvre en conséquence. – mark

Questions connexes