преобразование потока атомов в канал RSS - PullRequest
1 голос
/ 25 ноября 2010

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

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

1 Ответ

1 голос
/ 26 ноября 2010

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

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

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

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

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

...