2010-11-25 7 views
1

Je souhaite convertir une recherche XML ayant un flux d'atomes en flux rss. J'ai utilisé la méthode suivante:conversion d'un flux d'atomes en flux rss

public void AtomToRss20(string atomFileName, string rssFileName) 
    { 
     ConvertToRss20(ReadFeed(atomFileName), rssFileName); 
    } 

    private static void ConvertToRss20(SyndicationFeed feed, string rssFileName) 
    { 
     Rss20FeedFormatter rss2 = new Rss20FeedFormatter(feed); 
     XmlWriter writer = XmlWriter.Create(rssFileName); 
     rss2.WriteTo(writer); 
     // You can also use 
     // feed.SaveAsRss20(writer);   
    } 

    private static SyndicationFeed ReadFeed(string fileName) 
    { 
     StreamReader stream = new StreamReader(fileName); 
     XmlReader reader = XmlReader.Create(stream); 
     SyndicationFeed feed = SyndicationFeed.Load(reader); 
     return feed;   
    } 

Il exécute avec succès mais quand je considérais le fichier que je trouve qu'il est incomplet et se termine sans balise de fermeture. Quelqu'un peut-il dire s'il vous plaît le problème de cette méthode ou d'une autre méthode pour la conversion.

+0

Il serait utile que vous nous montriez le fichier que vous essayez de convertir + le résultat. – jgauffin

+0

@Chinmaya - Le titre de cette question devrait être généralisé autour de la sortie incomplète de XmlWriter. La conversion du flux d'un type à un autre n'est pas liée au problème. – Matt

Répondre

1

Pour des raisons de performances, la plupart des classes *Writer dans .NET mettent leur sortie en tampon; c'est-à-dire qu'ils n'écrivent pas directement sur le périphérique de sortie mais gardent certaines données en mémoire jusqu'à ce qu'elles atteignent une taille seuil. Lorsque vous fermez/disposez du programme d'écriture, il sait que vous en avez terminé et videra toutes les données mises en mémoire tampon vers la sortie.

Ici, vous créez un XmlWriter mais vous ne sont jamais la fermeture ou de la disposition, donc il a sans doute encore contenu en mémoire tampon qui est jamais vidé, d'où le dossier incomplet. Vous laissez également des ressources coûteuses ouvertes plus longtemps que nécessaire en ne les disposant pas.

vos instanciations de Entourez cours de mise en œuvre IDisposable avec un bloc using, par exemple:

using (XmlWriter writer = XmlWriter.Create(rssFileName)) 
{ 
    rss2.WriteTo(writer); 
} 

Ceci appellera la méthode Dispose sur l'écrivain à la fin du bloc, et rincer le contenu. Vous devriez également entourer l'instanciation de XmlReader avec un bloc using.