原子进料转换为rss进料

时间:2010-11-25 11:17:31

标签: xml rss atom-feed

我想将具有原子提要的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 个答案:

答案 0 :(得分:1)

出于性能原因,.NET中的许多*Writer类缓冲了它们的输出;也就是说,它们不直接写入输出设备,而是将一些数据保留在内存中,直到达到阈值大小。当您关闭/处理编写器时,它会知道您已完成它,并将所有缓冲的数据刷新到输出。

在这里,您创建了一个XmlWriter,但是您永远不会关闭或处置它,因此它可能仍然具有永不刷新的缓冲内容,因此文件不完整。你也将昂贵的资源开放的时间超过了必要的时间,而不是处理它。

使用IDisposable块围绕实施using的类的实例化,例如:

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

这将在块的末尾调用writer上的Dispose方法,并刷新内容。您还应该使用XmlReader块包围using的实例化。