2010-11-25 10 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

+0

@Chinmaya - この質問のタイトルは、XmlWriterが不完全な出力を書くことで一般化されるべきです。 1つのタイプから別のタイプへのフィードの変換は、問題に関係しません。 – Matt

答えて

1

パフォーマンス上の理由から、.NETの*Writerクラスの多くは出力をバッファします。つまり、出力デバイスに直接書き込むのではなく、しきい値サイズに達するまでデータの一部をメモリに保持します。ライターを閉じたり破棄したりすると、処理が完了したことが分かり、出力にバッファリングされたデータをフラッシュします。

ここではXmlWriterを作成しますが、決して閉じたり破棄したりすることはないため、フラッシュされないコンテンツ、つまり不完全なファイルがバッファされている可能性があります。また、高価なリソースを処分しないで必要以上に長い間オープンしています。

例えば、usingブロックでIDisposableを実装するクラスのインスタンスあなたのサラウンド:

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

これは、ブロックの最後に作家にDisposeメソッドを呼び出して、コンテンツをフラッシュします。また、XmlReaderのインスタンス化をusingブロックで囲む必要があります。