2010-11-25 1 views
1

Я хочу преобразовать XML-находку с подачей атома в RSS-канал. Я использовал следующий метод:преобразование подачи атома в 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;   
    } 

Он выполняется успешно, но когда я рассматривал файл, который я нашел, что она неполна и прекращаются с отсутствующими закрывающими тегами. Может кто-нибудь, пожалуйста, сообщите об этом в этом или другом методе преобразования.

+0

Это поможет, если вы покажете нам файл, который вы пытаетесь преобразовать + результат. – jgauffin 2010-11-26 09:05:51

ответ

1

По соображениям производительности многие из классов *Writer в буфере .NET выводятся; то есть они не записывают прямо на устройство вывода, но сохраняют некоторые данные в памяти до тех пор, пока не достигнут порогового размера. Когда вы закрываете/удаляете запись, тогда она знает, что вы закончили с ней, и выведет на буфер любые буферизованные данные.

Здесь вы создаете XmlWriter, но вы никогда не закрываете и не удаляете его, поэтому он, вероятно, все еще имеет буферизованное содержимое, которое никогда не очищается, а значит, и неполный файл. Вы также оставляете дорогостоящие ресурсы открытыми дольше, чем это необходимо, не удаляя их.

Окружите вашу инстанциацию классов, реализующие IDisposable с using блоком, например:

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

Это будет вызывать Dispose метод на писателе в конце блока, и промойте содержимое. Вы также должны окружить экземпляр XmlReader блоком using.